我的快递'结束'事件未被发出。请粉碎一些关于如何修复它的提示。
快速设置:
//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解决方案。
总之,
对于http PUT,我们应该使用bodyParser.json或req.on('end',function),但不能同时使用两者。对于http POST,我们应该使用两者;
bodyParser.json返回的结果是req.body,它是一个JSON对象,而req.on('end',function)在我的代码中返回一个字符串;
全部谢谢!
答案 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的路由分开。