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:
-
你可以从你的路由中移除body-parser中间件,这样它就不会读取stream,然后你可以在你的路由处理器中自己读取stream。 这可以通过完全删除body-parser中间件来完成,也可以通过指定它不会影响您要跳过的特定路由。
-
您可以使用
bodyParser.text()
而不是bodyParser.json()
,中间件将以文本的forms读取主体,所以当快速调用您的路由处理程序时,主体已经作为文本读取并以纯文本的forms放入req.body
。 -
你使用已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();
- 如何告诉Express不parsing请求的查询string?
- socket.io客户端在刷新后多次听相同的事件
- 如何在express中使用cookieSession
- Node.js(使用socket.io和express)抛出“events.js:71 throw arguments ; //未处理“错误”事件“
- Node.js,express.js&hogan.js:部分在第二次刷新后无法正确加载
- 我怎样才能在快递js手动触发路由处理程序?
- Mongoose更新子文档数组
- 是否可以在Node / Express 4.0中声明全局variables?
- node.js / express / mongoose noob问题