首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs:通过调用异步服务来同步响应请求

Nodejs:通过调用异步服务来同步响应请求
EN

Stack Overflow用户
提问于 2022-05-05 11:13:22
回答 1查看 110关注 0票数 1

我正在编写一个基于Nodejs的服务,N,位于实体A和B之间。

代码语言:javascript
复制
A <----> N <----> B

App APOST是对N的同步请求,N必须用它只能通过调用外部服务B获得的数据来响应。

问题是,B是一个异步服务/API:对任何N POSTs到B的响应首先使用HTTP 202 (“请求已接受”),然后使用实际数据作为从B到N的回调POST请求,因此,实际上,在单线程N中,我必须以某种方式保持来自A的当前同步请求“暂停”,而不阻塞来自A到N的其他潜在请求,同时N和B之间的异步消息交换完成来自当前搁置的A的请求。

比如说,在Nodejs中,是否可以使用承诺或async/await魔术?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-05 12:28:42

使用请求id、本地缓存和超时,您可以执行如下操作:

代码语言:javascript
复制
const requestIdAndResponseDetailsMap = {};


router.post('/request-from-a', function requestFromAHandler(request, response) {

  const requestId = request.body.id;
  makeCallToB(request.body); // ensure that request id is passed to B and sent in the call from B to N.
  cacheServiceAResponseWithTimeout(requestId, response);

});

router.post('/callback-from-b', function callbackFromBHandler(request, response) {

  const dataFromB = request.body;

  tryRespondToA(dataFromB);

  response.json({ success: true });

});

function tryRespondToA(responseFromB) {
  const requestId = responseFromB.id;
  const cachedData = requestIdAndResponseDetailsMap[requestId];

  if(cachedData === undefined) {
    return;
  }
  delete requestIdAndResponseDetailsMap[requestId];
  clearTimeout(cachedData.timerReference);
  cachedData.response.json(responseFromB);
  
}

function cacheServiceAResponseWithTimeout(requestId, response) {
  
  const timerReference = setTimeout(function timerCallback() {
    const cachedData = requestIdAndResponseDetailsMap[requestId];
    delete requestIdAndResponseDetailsMap[requestId];
    cachedData.response.json({ message: 'Service B request timed out' });
  }, TIMEOUT_IN_MILLISECONDS);

  requestIdAndResponseDetailsMap[requestId] = { response, timerReference };

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72126225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档