express.js 4已经打破了request.on('data')触发

我希望有人可以find我做错了什么,或者可以validation我发现是真实的。

在发布到node.js服务器上的post中,世界上没有任何方法可以使用request.on('data')。 身体分析器/ JSON只是不正确地设置expression或expression不是做它的工作,或两者兼而有之。

以下是两个配对项目,一个服务器和一个客户端发送一个post到服务器。 都在node.js. 服务器包括快速和身体分析器

这是服务器端:

/* 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(); 

我希望有人可以find我做错了什么,或者可以validation我发现是真实的。

Node.js 4.2.4(客户端和服务器)

Express 4.9.8(服务器)

Body-Parser.js 1.8.4(服务器)

谢谢。

我会采取我的意见,并形成一个答案。

body-parser中间件将读取post的整个主体,parsing它并将parsing的结果放到req.body 。 这意味着,如果中间件对于特定的路由是活动的,并且内容types匹配中间件正在查找的内容,则它将已经读取stream,并且当快递到达您的路由处理器时,没有更多的stream可读取因此你不会得到任何“数据”事件。

所以,如果你所追求的是一个未经处理的粗糙的身体,那么你有几个select:

  1. 你可以从你的路由中移除body-parser中间件,这样它就不会读取stream,然后你可以在你的路由处理器中自己读取stream。 这可以通过完全删除body-parser中间件来完成,也可以通过指定它不会影响您要跳过的特定路由。

  2. 您可以使用bodyParser.text()而不是bodyParser.json() ,中间件将以文本的forms读取主体,所以当快速调用您的路由处理程序时,主体已经作为文本读取并以纯文本的forms放入req.body

  3. 你使用已parsing的req.body而不是自己读取和parsingJSON。

这是关于一个最小的,因为我可以做到。 这是没有使用身体分析器。 由于Body-Parser完全取代了'req'variables,困惑渐渐侵入。

感谢和信用jfriend00

– 服务器端等待后 –

 var express = require('express'); var app = express(); app.get('/', function (req, res) { res.sendStatus(200) }); app.post('/', function (req, res, next) { var data = ''; req.on('data', function (chunk) { data += chunk; }); req.on('end', function () { console.log("-----"); console.log("hdr", req.headers['content-type']); console.log("raw", JSON.parse(data)); }); res.sendStatus(200); }); module.exports = app; 

– 客户端发送到服务器—

 var http = require("http"); var options = { "method": "POST", "hostname": "127.0.0.1", "port": "1337", "path": "/", "headers": { "content-type": "application/json" } }; var req = http.request(options, function (res) { process.exit(); }); req.write(JSON.stringify( { theGreatestHit: 'ChuckBerry Maybellene' })); req.end();