我希望有人可以发现我做错了什么,或者可以验证我发现的是真的。
在发送到 node.js 服务器时,世界上没有任何方法 request.on('data')
有效。
Body-parser/json 只是没有正确设置 express 或 express 没有完成它的工作,或两者兼而有之。
以下是两个配对项目,一个服务器和一个客户端,用于向服务器发送帖子。两者都在 node.js 中。服务器包括 express & body-parser
这是服务器端:
/* Used to start Node
var debug = require('debug')('ExpressApp1');
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
*/
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var fRawBody = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
console.log("buf", req.rawBody);
}
}
app.use('/', bodyParser.json({ verify: fRawBody }));
app.use('/', function (req, res, next) {
var data = '';
req.on('data', function (chunk) {
console.log("content-type", req.headers['content-type']);
console.log('data: chunk', chunk);
data += chunk;
});
req.on('end', function () {
req.rawBody = data;
console.log("raw", req.rawBody);
});
res.sendStatus(200);
});
module.exports = app;
--- app.js 结束----
这是客户端。
客户端 response.on('data') 工作正常。
var http = require("http");
var options = {
"method": "POST",
"hostname": "127.0.0.1",
"port": "1337",
"path": "/",
"headers": {
"content-type": "application/json",
"cache-control": "no-cache",
"postman-token": "44e8850a-7a9d-42ce-fbbf-02ac3e6e051b"
}
};
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
process.exit();
});
});
req.write(JSON.stringify({ data: { theGreatest: 'SMT' } }));
req.end();
我希望有人可以发现我做错了什么,或者可以验证我发现的是真的。
Node.js 4.2.4(客户端和服务器)
Express 4.9.8(服务器)
Body-Parser.js 1.8.4(服务器)
谢谢。
最佳答案
我会把我的评论变成一个答案。
body-parser
中间件将读取帖子的整个正文,对其进行解析并将解析结果放入req.body
。这意味着如果该中间件对于特定路由是事件的并且内容类型匹配中间件正在寻找的内容,那么它已经读取了流并且当 express 到达您的路由处理程序时,没有更多的流可以读取和因此您不会收到任何“数据”事件。
因此,如果您想要的是原始的、未解析的字符串形式的正文,您有多种选择:
您可以从路由中删除 body-parser 中间件,这样它就不会读取流,然后您可以在路由处理程序中自己读取流。这可以通过完全删除 body-parser 中间件或指定它对您要跳过它的特定路由无效的方式来完成。
您可以使用
bodyParser.text()
而不是bodyParser.json()
中间件会将正文读取为文本,因此当 express 调用您的路由时处理程序,正文已作为文本读取并作为纯文本放入req.body
。您使用已解析的
req.body
而不是自己读取和解析 JSON。
关于javascript - express.js 4 has broken request.on ('data' ) 触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893931/