前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《Node.js权威指南》:获取客户端请求信息

《Node.js权威指南》:获取客户端请求信息

作者头像
前端_AWhile
发布于 2022-05-10 08:50:14
发布于 2022-05-10 08:50:14
7.2K00
代码可运行
举报
文章被收录于专栏:前端一会前端一会
运行总次数:0
代码可运行

上一篇《《Node.js权威指南》:如何创建HTTP服务器》中概括的介绍了创建HTTP服务器的套路,包括创建http服务器对象,用服务器对象监听客户端连接事件、错误事件和服务器关闭事件等,整体示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require( "http" );
const event = require( "events" );

class myEmitter extends event.EventEmitter{};
let emitter = new myEmitter();

// 调用http模块的createServer()方法,传入回调函数,方法返回创建的HTTP服务器对象
let app = http.createServer( function ( req, res ) {
    // req 客户端请求对象
    // res 服务器端响应对象
    res.writeHead( 200, { "Content-type": "text/html" } );
    res.write( "<head><meta charset='utf8'></head>" );
    res.end("你好nitx");
} )

// 服务器监听 error 事件
app.on( "error", function ( e ) {
    if( e.code === "EADDRINUSE" ){
        console.log( "地址及商品被占用。" );
    }
} )

// 服务器对象监听 客户端连接 事件
app.on( "connection", function ( socket ) {
    console.log( "客户端连接已建立。" );
} )

// 服务器对象监听 服务器关闭 事件
app.on( "close", function () {
    console.log( "服务器已关闭。" );
} )

// 主动设置定时器 2秒后 触发 服务器对象的close()方法关闭服务器
setTimeout( function () {
    emitter.emit( app.close() );
}, 2000 )

// 服务器对象监听 1338 商品,host和backlog参数默认
app.listen( 1338, ()=>{ console.log( "service is running at port 1338." ); } );

在上例中回顾下nodejs中的事件监听,nodejs用于实现各种事件处理的events模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个继承了EventEmitter类的子类的实例对象。

获取客户端请求信息

HTTP服务器接收到客户端请求时调用的回调函数中的第一个参数值是一个http.IncomingMessage对象,该对象用于读取客户端请求流中的数据。当从客户端请求流中读取到新数据时触发data事件,当读取完客户端请求流中的数据时触发end事件。当该对象被用于读取客户端请求流中的数据时,该对象拥有如下属性:

  • method:该属性值是一个字符串,字符串值为客户端向服务器端发送请求时使用的方法,如GETPOSTPUTDELETE等。
  • url:该属性值是客户端发送请求时使用的url参数字符串,例如//abc/1post/new?param=value等。这个属性非常重要,通常用来判断客户端请求的页面和需要执行的处理。
  • headers:该属性值是客户端发送的请求头对象,存放客户端发送的所有请求头信息,包括cookie信息和浏览器的各种信息。
  • socket:该属性值是服务器端用于监听客户端请求的socket对象。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require( "http" );

let app = http.createServer( function ( req, res ) {
    console.log( `客户端请求方法为:${req.method}` );
    console.log( `客户端请求所用url字符串为:${req.url}` );
    console.log( `客户端请求头对象为:${req.headers}` );
    console.log( `客户端请求所用HTTP版本为:${req.httpVersion}` );
    console.log( `客户端请求的socket对象为:${req.socket}` );
    res.writeHead( 200, { "Content-type": "text/html" } );
    res.write( "<head><meta charset='utf8'></head>" );
    res.end( "大家好,我是nitx" );
} )

app.listen( 1339, ()=>{ console.log( "service is running at port 1339." ); } )

当客户端请求用http://localhost:1339/abc?param=value这个url请求时,上例的打印结果为:

前面说了当HTTP服务器对象createServer()方法中回调函数第一个参数http.IncomingMessage对象从客户端请求数据流读到新数据时会触发data事件,读完数据时会触发end事件,下面就来个示例看下这两个事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// app.js
const http = require( "http" );

let app = http.createServer( function ( req, res ) {
    if( req.url !== "/favicon.ico" ){
        req.on( "data", function ( data ) {
            console.log( "服务器端接收的数据为:" + decodeURIComponent( data ) );
        } )
        req.on( "end", function () {
            console.log( "客户端请求的数据已全部接收完毕。" );
        } )
    }
    res.end();
} )

app.listen( 1335, "127.0.0.1", ()=>{ console.log( "service is running at port 1335." ); } )


// index.html
<body>
    <form action="http://127.0.0.1:1335" method="POST">
        <input type="text" name="name">
        <input type="number" name="age">
        <input type="submit" value="提交">
    </form>
</body>

index.html中进行表单数据提交后,app.js控制台打印结果为:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AMBA、AHB、APB、AXI总线介绍及对比
AMBA (Advanced Microcontroller Bus Architecture) 高级微处理器总线架构
数字芯片社区
2020/07/14
3.2K0
AMBA、AHB、APB、AXI总线介绍及对比
AMBA总线架构简介
于是乎,我们想到了总线,用一个统一的接口协议,设计出一个符合要求的总线,然后将ARM核和各种外设模块挂载在总线上,这样,命令和数据似乎便可以在CPU和外设之间自由穿梭。
233333
2023/10/31
6890
AMBA总线架构简介
AMBA之AHB总线学习笔记
AHB同是由ARM提出的总线规范,全称为Advanced High Performance Bus,高级高性能总线(高性能、高速时钟),主要用于高速模块(如CPU、DMA、DSP)之间的连接,作为SoC的片上系统总线,它包括以下特性:
根究FPGA
2020/09/10
1.8K0
AMBA之AHB总线学习笔记
AXI接口协议详解-AXI总线、接口、协议
上面介绍了AMBA总线中的两种,下面看下我们的主角—AXI,在ZYNQ中有支持三种AXI总线,拥有三种AXI接口,当然用的都是AXI协议。其中三种AXI总线分别为:
碎碎思
2020/09/10
12.8K1
AXI总线知多少?
AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA3.0中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。AMBA4.0将其修改升级为AXI4.0。
数字芯片社区
2020/07/14
3.2K0
AXI总线知多少?
AMBA总线协议(一)——一文看懂APB总线协议
AMBA(Advanced Microcontroller Bus Architecture) 总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度低功耗等特点。
233333
2023/10/30
3K0
AMBA总线协议(一)——一文看懂APB总线协议
AXI协议
AXI(Advanced eXtensible Interface)是一种总协议,该协议是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)3.0协议中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数 据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持显著传输访问和乱序访问,并更加容易并行时序收敛。AXI是AMBA 中一个新的高性能协议。AXI 技术丰富了现有的AMBA
瓜大三哥
2018/02/24
1.6K0
AXI协议
AMBA之APB总线学习笔记
APB、AHB、AXI AMBA(Advanced Micro-controller Bus Architecture)用于芯片内各个部件的互联,包含三种类型总线:APB、AHB以及AXI。
根究FPGA
2020/08/31
4K0
常见的AXI总线仲裁器概述
AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。
数字IC小站
2020/06/30
3.5K0
AHB总线传输(时序)
如果是写操作,master获取HREADY高信号,表明slave已成功接收数据,操作成功;
数字芯片社区
2020/08/27
7.2K0
AHB总线传输(时序)
AHB总线(宏观构造)
① AHB主设备Master; 发起一次读/写操作;某一时刻只允许一个主设备使用总线;
数字芯片社区
2020/08/27
1.2K0
AHB总线(宏观构造)
AMBA (Advanced Microcontroller Bus Architecture) 高级微控制器总线架构
AMBA (Advanced Microcontroller Bus Architecture) 高级微控制器总线架构
FPGA开源工作室
2021/07/09
1.6K0
深入AXI4总线-[二]架构
作为类比,SPI 总线有 2 条单向传输通道:MISO, MOSI。SPI 输入和输出的数据,大路朝天,各走一条。
空白的贝塔
2020/06/24
1.2K0
深入AXI4总线-[二]架构
Xilinx FPGA AXI4总线(一)介绍【AXI4】【AXI4-Lite】【AXI-Stream】
(3)自定义一个 AXI-Lite 的 IP 作为从机设备 Slave,并将其挂载到 AXI Interconnect 上,由 ZYNQ 的 PS 侧作为主机来控制 LED;
FPGA探索者
2021/03/29
6K0
Xilinx FPGA AXI4总线(二)用实例介绍 5 个读写通道
AXI4协议是一个点对点的主从接口协议,数据可以同时在主机(Master)和从机(Slave)之间双向传输,且数据传输大小可以不同。
FPGA探索者
2021/03/30
4.6K0
Xilinx FPGA AXI4总线(二)用实例介绍 5 个读写通道
深入AXI4总线-[三]传输事务结构
那么在数据传输的范畴中,就使用 burst 来表示一种传输模式:在一段时间中,连续地传输多个(地址相邻的)数据。此时可译为突发传输或者猝发传输。
空白的贝塔
2020/06/24
3.1K0
深入AXI4总线-[三]传输事务结构
Xilinx FPGA AXI4总线(三)——握手机制、通道依赖性及AXI-Lite握手实例
AXI4:高性能内存映射需求(如读写DDR、使用BRAM控制器读写BRAM等),为了区别,有时候也叫这个为 AXI4-Full;
FPGA探索者
2021/04/15
3.4K0
Xilinx FPGA AXI4总线(三)——握手机制、通道依赖性及AXI-Lite握手实例
AXI总线简介(一)
AXI4.0-lite是AXI的简化版本,ACE4.0 是AXI缓存一致性扩展接口,AXI4.0-stream是ARM公司和Xilinx公司一起提出,主要用在FPGA进行以数据为主导的大量数据的传输应用。
瓜大三哥
2019/06/20
2.1K0
AXI学习笔记-11.AXI总线结构2.AXI接口时序3.数据结构4.传输特性
握手信号包括VALID和READY信号,传输行为仅在VALID和READY同时有效时发生。其中:
月见樽
2018/11/19
8.9K0
AXI是Interface还是Bus?
AXI全称Advanced eXtensible Interface,是Xilinx从6系列的FPGA开始引入的一种接口协议,主要描述了主设备和从设备之间的数据传输方式。该协议是AMBA3.0(Advanced Microcontroller Bus Architecture)中最重要的部分,是一种面向高性能、高带宽、低延迟的片内接口协议。AMBA4.0将其修改升级为AXI4.0,如下图所示。
Lauren的FPGA
2020/09/10
2.2K0
AXI是Interface还是Bus?
相关推荐
AMBA、AHB、APB、AXI总线介绍及对比
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验