Express接口联调过程

由于公司需要,尝试使用Node进行开发接口服务.但是在调试的过程中发现很多一些问题,在这里简单整理了一下形成文章.

文章主要涉及两方面的内容:

  1. body-parser与Content-Type
  2. socket通信调试

Body-parser的简单分析

express采用的body-parser中间件进行body解析的,如果不使用中间件的话,那么收到的body是一个stream对象,这个stream对象可以进行stream支持的一些操作,比如pipe,所以可以使用 request的stream通过pipe到一个writeStream保存到一个图片文件中.

Body-paser有四种接口形式:

  1. Json解析的json字符串并返回一个object对象
  2. Raw 强制解析成buffer对象
  3. Text 强制解析成string对象
  4. Urlencoded 解析urlencoded解析后的object对象

不同的接口形式可以进行不同的选择,比如如果入参为json字符串的话,就可以使用json接口,这样就可以通过req.body拿到解析后的object对象,使用起来非常方便.

不同的传参方式也就以为着不同的传输格式.如果使用不正确的解析方式,解析结果也会大不相同,比如我在使用urlencoded处理传输进去的字符串的时候,如果不指定Content-Type为application/x-www-form-urlencoded的话,可能默认采用的json格式去解析的,也就会造成我拿到的req.body是一个空对象,即{}.

Socket事件监听与通信调试

项目已经代码在: https://github.com/fengxiaochuang/socketDebug

其实一个市场项目推进我去了解并且尝试调试nodejs的socket调试,因为我们在尝试使用telnet去测试socket的时候,发现只要乱输入的话,telnet就会直接断开,并且返回一个Connection refuse(仅Linux上出现,Windows无返回错误直接关闭并退出).

事实上,通过Node http.createServer 创建的一个web服务,是只接受标准的HTTP协议输入的.如果输入的是其他不标准的字符,就会通过socket抛出一个Parse Error异常,如” HPE_INVALID_METHOD”, ‘HPE_INVALID_CONSTANT’.

通过监听Socket的几个事件,就可以轻松的捕获到异常和输入的通信信息.

Connetion事件:

Emitted when a new connection is made. socket is an instance of net.Socket.

新建连接时发出。 socket是net.Socket的一个实例。

server.on("connection", function (socket) {         // TODO: do some thing})

由于创建连接后,会产生一个socket,所以就可以使用socket的各种方法和属性,比如:

// 请求地址对象信息
console.log(socket.address());
// 远程访问的ip地址
console.log(socket.remoteAddress);
// ipv4 or ipv6
console.log(socket.remoteFamily);
// 远端请求端口
console.log(socket.remotePort);

因为是socket,所以我也可以通过监听socket来达到捕获具体的信息通道.

捕获传输数据的事件并打印

socket.on('data', function (res) {
console.log("接受到的数据:" + res.length);
console.log(res.toString("utf8"));
request += res.toString();
});

捕获socket异常

socket.on('error', function (err) {
RequestInfo.write(request); // 封装了一个保存报文信息的文件
console.log(err);
});

同样,也可以捕获end, close, finish事件,然后获取相关信息.

socket.on('end', function () {
console.log('connection is end');
});
socket.on('close', function () {
console.log('connection is close');
});
socket.on('finish', function () {
console.log('connection is finish');
});

除此之外,http请求触发事件,当一个标准的http协议请求来的时候就能够触发.

// 只要有标准HTTP协议请求就触发
server.on("request", function (req) {
// http.IncomingMessage
// header信息
console.log(req.headers);
// 请求方法
console.log(req.method);
// console.log(req.rawHeaders);
// console.log(req.rawTrailers);
// 请求码
console.log(req.statusCode);
// 状态信息
console.log(req.statusMessage);
// socket对象
console.log(req.socket);
// 请求地址
console.log(req.url);
});

参考链接:

https://nodejs.org/api/http.html

https://nodejs.org/api/net.html#net_class_net_socket

https://nodejs.org/api/stream.html

 



三月 28th, 2017 by