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

Node.js 对nodejs中的单个请求调用两次request.on(可读),node.js,connect,Node.js,Connect,我是nodejs的新手,现在我正在学习http模块 我为node编写了一个js程序来检查请求中的内容类型是否为application/json,然后它应该在“readable”事件中进行控制台操作 发生的情况是:在一个调用两次的“可读”事件上,第一次打印值,第二次返回null 以下是代码: var connect = require('connect'); function jsonParse(req, res, next) { if (req.headers['content-ty

我是nodejs的新手,现在我正在学习http模块

我为node编写了一个js程序来检查请求中的内容类型是否为application/json,然后它应该在“readable”事件中进行控制台操作

发生的情况是:在一个调用两次的“可读”事件上,第一次打印值,第二次返回null

以下是代码:

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);
我这样称呼:

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


请指导我如何处理这件事。提前感谢。

您应该仅在数据可用时读取请求,因此当
req.read()
不返回
null
。您可以通过
while
循环检查这一点

替换:

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


请共享控制台这是通过控制台语句打印的结果:inside readable{“foo”:“asdf”}inside readable Null您能告诉我为什么调用了两次吗?很少有人建议浏览器再发送一次favicon图标请求。那我们怎么处理呢?你可以用它作为中间商你用快递还是什么?
var readData = '';
req.on('readable', function(){
    var chunk;
    while (null !== (chunk = req.read())){
        readData += chunk;
    }
});