我是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);
输出为: 内部可读{ “ foo”:“ asdf” } 内部可读的空
请指导我如何处理。预先感谢。
答案 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;
}
});