对node.js中的单个请求request.on(可读)调用了两次

时间:2018-12-07 08:39:53

标签: node.js connect

我是nodejs的新手,现在我是learningig http模块。

  

我为节点编写了一个js程序,以检查content-type是否在请求中是application / json,然后应在“可读”事件时进行控制台。

     

发生的事情是:在单个请求上调用两次的“可读”事件,并在第一次和第二次返回空值时打印该值。

这里是代码:

var connect = require('connect');


function jsonParse(req, res, next) {
    if (req.headers['content-type'] == 'application/json' && req.method == 'POST') {
        var readData = '';
        req.on('readable', function() {
            console.log('inside readable ' + req.read());
            readData += req.read();
        });

        req.on('end', function() {
            try {
                req.body = JSON.parse(readData);
            } catch (e) {
            }   
            next();
        })
    } else {
        next();
    }
}

connect()
.use(jsonParse)
.use(function(req, res) {
    if (req.body) {
        res.end('JSON parsed !' + req.body);
    } else {
        res.end('no json detected !');  
    }
}).listen(3000);
  

我这样称呼:   enter image description here

     

输出为:   内部可读{   “ foo”:“ asdf”   }   内部可读的空

请指导我如何处理。预先感谢。

1 个答案:

答案 0 :(得分:1)

您仅应在有可用数据时从请求中读取内容,这样当req.read()不会返回null时。您可以使用while循环进行检查。

替换:

var readData = '';
req.on('readable', function() {
    console.log('inside readable ' + req.read());
    readData += req.read();
});

使用:

var readData = '';
req.on('readable', function(){
    var chunk;
    while (null !== (chunk = req.read())){
        readData += chunk;
    }
});