Express req.on('end',...)没有被解雇

时间:2017-12-12 02:07:39

标签: node.js express

我的快递'结束'事件未被发出。请粉碎一些关于如何修复它的提示。

快速设置:

//Enable CORS
console.log("Enabled CORS and all pre-flight request");
app.use(cors())
app.options('*', cors()) // enable pre-flight request for ALL request
app.use(bodyParser.json({ type: 'application/*+json' }));   //James 11/7/2017
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }));

路由器设置:

//update
app.put('/:resourceType/id/:idPatient', function (req, res, next) {
        console.log("update by Id [" + req.params.resourceType + "][" + req.params.idPatient + "][" + JSON.stringify(req.body) + "]");
        gModel.fhirUpdateById(req, res, next, false); // isDeleted = false
});

每次都可以看到console.log以上,

// Handler
module.exports.fhirUpdateById = function (req, res, next, isDeleted) {

    var body = '';
    //Test 1: Direct call without req.on, then can't parse the body
    //updateById((req.params.resourceType, req.params.resourceId, res, next, req.body, isDeleted));

    //Test 2:
    req.on('data', function (data) {
        body += data;
    });

    req.on('end', function () {
        console.log("fhirUpdateById Resource type: [" + req.params.resourceType + "]  Body: [" + body + "]");
        updateById((req.params.resourceType, req.params.resourceId, res, next, body, isDeleted));
    });
}

上面的console.log从未显示过。 req.on('end', function () ...)从未被激活过;)

问题:
1.如何修复req.on('end'...)触发?
2.我应该在app.use()上放置req.on('data')和req.on('end'),因为我想在各种PUT和POST上获得整个请求吗? 3.如果我不使用req.on,即使我的身体小于1MB,我会得到一个部分身体吗?

如果您需要更多信息,请与我们联系。 感谢。

=============================================== =========

解决:

请参阅下面的Sandip解决方案。

总之,

  1. 对于http PUT,我们应该使用bodyParser.json或req.on('end',function),但不能同时使用两者。对于http POST,我们应该使用两者;

  2. bodyParser.json返回的结果是req.body,它是一个JSON对象,而req.on('end',function)在我的代码中返回一个字符串;

  3. 全部谢谢!

2 个答案:

答案 0 :(得分:2)

发现了这个问题。如果使用正文解析器中间件,则不会触发请求对象上的unsigned int i = -1; printf("%d\n", (int)i); // unsigned to signed data事件。我从您的代码中删除了主体解析器,并且事件开始触发。实际上,身体解析器为您通过end事件监听器尝试实现的工作。

所以,你要么完全删除身体解析器

data

或者,您应该使用正文解析器并直接从//Enable CORS console.log("Enabled CORS and all pre-flight request"); app.use(cors()) app.options('*', cors()) // enable pre-flight request for ALL request //update app.put('/:resourceType/id/:idPatient', function (req, res, next) { console.log("update by Id [" + req.params.resourceType + "][" + req.params.idPatient + "][" + JSON.stringify(req.body) + "]"); gModel.fhirUpdateById(req, res, next, false); // isDeleted = false }); 获取数据

要了解其工作原理,您可以看到此article

答案 1 :(得分:0)

FYI-发现在路由上需要express.urlencode也会导致同样的问题。我最终重新组织了路由,以将受影响的路由(需要单独编码的路由)与需要进行urlencoded的路由分开。