【发布时间】:2021-03-15 13:25:50
【问题描述】:
我正在使用带有 express 的 NodeJS。
我收到信息发布者的请求。我必须在收到请求后立即发回确认响应。然后我应该处理请求并返回响应。
根据他们的日志,我发回的确认响应太晚了,而且是在推送了真正的响应之后。这是错误的,不是我想要的。我想跟随这张图片中的模型:
所以我有一个带有以下代码的 router.js 文件:
app.post('/import/message.io', Importer.handleMessage);
在导入控制器中,handleMessage 函数处理请求:
function handleMessage(req, res){
let otaRequestBuffer = [];
req.on('readable', () => {
let data;
while (data = req.read()) {
otaRequestBuffer.push(data.toString());
}
});
req.on('end', () => {
let otaRequest = otaRequestBuffer.join('');
try {
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(otaRequest, "text/xml");
let soapHeader = parseSoapHeader(xmlDoc);
const soapAction = req.headers['soapaction'].toString();
// Acknowledge the request; The soapHeader is used in here too. That is why it is after the code above
res.writeHead(200);
res.write(
`<?xml version='1.0' encoding='utf-8'?> ...
`
);
res.end();
// Kick off a new job by adding it to the work queue; Response is send in the consumer.js of this job
let job = jobs.create('worker-job', args);
job.on('complete', function(result){
console.log('Job completed');
// Other job.on code would be here
})
} catch (error) {
console.log(error);
} finally {
console.log('DevInfo: Finally called here');
}
});
其他见解:
- 因此确认响应的格式正确。
- 当我在本地测试时,我会立即收到确认
- 信息发布者的日志在这里
根据日志,他们的实际响应(第 5 行)似乎在确认响应(第 1 行)之前被推送给他们。
我上面粘贴的代码示例可以做到这一点吗?
感谢您的帮助。
【问题讨论】:
标签: node.js asynchronous request response