javascript - express.js 4 has broken request.on ('data' ) 触发

标签 javascript node.js express

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

在发送到 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 到达您的路由处理程序时,没有更多的流可以读取和因此您不会收到任何“数据”事件。

因此,如果您想要的是原始的、未解析的字符串形式的正文,您有多种选择:

  1. 您可以从路由中删除 body-parser 中间件,这样它就不会读取流,然后您可以在路由处理程序中自己读取流。这可以通过完全删除 body-parser 中间件或指定它对您要跳过它的特定路由无效的方式来完成。

  2. 您可以使用 bodyParser.text() 而不是 bodyParser.json() 中间件会将正文读取为文本,因此当 express 调用您的路由时处理程序,正文已作为文本读取并作为纯文本放入 req.body

  3. 您使用已解析的 req.body 而不是自己读取和解析 JSON。

关于javascript - express.js 4 has broken request.on ('data' ) 触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893931/

相关文章:

javascript - 如何添加不同的占位符颜色

node.js - Sequelize 迁移无法正常工作

node.js - 带有express和mikeal/request库的nodejs代理

node.js - 序列化查询 where createAt 日期(例如今天的日期)

javascript - 如何使用 Next.js 检查自定义服务器中是否存在页面

javascript - 尝试在确认消息 : Javascript 中显示变量值

javascript - 在 UnderscoreJs 中获取数组中数字之间的对象

php - javascript - 如何将 json 数据分配给 HTML 元素并发送到 API onclick?

javascript - 无法调用未定义的方法 'ui'

javascript - 如何在 then() 方法内发送响应,然后再发送另一个 then() 方法?