我正在开发一个API,它接受包含媒体ID的XML输入,并以XML格式提供输出,并提供给定ID的详细信息。发送第二个同时请求的响应时我遇到了问题;这里第二个请求进入循环显示" loading"邮递员。
我正在做的是调用res.send
中的一个函数来解析媒体并在回调中提供输出并使用res.send
发送它,但它仅适用于单个请求。
在对同一个API执行并行请求时,它会循环播放,或者在我使用res.send
后发送它们时无法设置标题,但var getCompositeData = function(req, res, next){
abc.getData(req.body, function(err, xmlOutput){
if(err){
console.log("error");
} else {
xmlData = xmlOutput
return next()
}
}
app.post(apiUrl, [
rawBodyParser({
type: 'application/xml'
}),
app.oauth.authorise()
], getCompositeData, function (req, res) {
res.setHeader('Content-Type', 'application/xml');
res.send(xmlData);
});
是唯一的方式我可以用它来发送响应(即使下一个没有工作)。
{{1}}
答案 0 :(得分:0)
您的代码存在以下问题:
if (err) {
console.log("error");
}
如果发生错误,您仍然需要确保将回复响应,否则请求将停止,直到发生超时。您可以将错误传递给next
,Express会处理它:
if (err) {
return next(err);
}
下一个问题:
xmlData = xmlOutput
xmlData
是一个未声明的变量,会被每个请求覆盖。如果两个请求在(几乎)同时发生,则可能是一个客户端返回错误的响应(请记住,Node.js在单个线程中运行JS代码;没有线程本地存储,因此xmlData
得到在所有请求之间共享。)
“存储”此类数据的好地方在res.locals
:
res.locals.xmlData = xmlOutput;
return next();
// and later:
res.send(res.locals.xmlData);