on(readable)在nodejs中为单个请求调用两次

rm5edbpk  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(144)

我是nodejs的新手,现在我正在学习http模块。
我为node写了一个js程序来检查请求中的content-type是否是application/json,那么它应该在'readable'事件时控制台。
发生的是:在一个单一的请求'可读'事件调用两次,并打印值第一次和第二次返回空。
代码如下:

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);

我把它叫做:

输出为:inside readable {“foo”:“asdf”} inside readable null
请指导我如何处理这件事。先谢谢你了。

gopyfrb3

gopyfrb31#

您应该只在数据可用时从请求中读取,因此当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;
    }
});

相关问题