在nodejs中同时处理请求并仅使用一个res.send传递它的响应

时间:2017-10-09 07:01:31

标签: node.js http

我正在开发一个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}}

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);