首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在db查询不返回null之前保持节点api执行。

如何在db查询不返回null之前保持节点api执行。
EN

Stack Overflow用户
提问于 2020-10-28 22:21:32
回答 2查看 28关注 0票数 0

对于一段代码来说,这似乎是一种不必要的需求,但在我的例子中,这正是我需要的。我有一个与第三方服务交互的api (API-1)。这个第三方服务不是直接给我一个可以转发回前端的响应,而是在API-2上给我响应(带有一个webhook侦听器端点)。我正在保存这个API-2响应,它是通过侦听数据库中的webhook而获得的。现在不知何故,我需要这个响应,它现在坐在我的数据库中,在我的API-1中,这样我就可以将它转发回前端。如果我在API-1的流程中立即查询数据库(恰好在使用第三方服务API之后),我将得到null,因为API-2使用webhook异步地获取响应(主要间隔1-2秒)。因此,我需要找出一种简单的方法来等待/保持API-1流,直到数据库不返回null/返回我在数据库中从API-2保存的响应。我不确定间隔是否会一直是1-2秒,因此我不能使用setTimeout。

代码语言:javascript
运行
复制
//API-1
const sendPaymentRequest = async (req, res) => {
  try {
    const payment_reponse = await axios.post(url, body, config);
    const { data } = payment_reponse;
    console.log("Payment request => ", data);

    //Check result i.e response from http listener
    const webhookResponse = await MpesaModel.findOne({
      conversationId: data.ConversationID
    });

    console.log('Webhook response => ', webhookResponse); //This is null

    res.status(200).json({ message: "Send money request", data });
  } catch (error) {
    console.log("Error while making a payment request", error);
    res
      .status(400)
      .json({ message: "Error while send payment request", error: error.data });
  }
};


//API-2 - This is the webhook which receives the response
const saveWebhookB2C = async (req, res) => {
  const { Result } = req.body;
  //console.log('Mpesa webhook data received => ', Result);

  let saveResponse = new MpesaModel({
    ...Result,
  });
  const result = await saveResponse.save();
  console.log('B2c mpesa to kenya saved in db => ', result);
  res.status(200).send();
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-28 22:59:06

只需等待响应不同于null:

代码语言:javascript
运行
复制
let webhookResponse = null;
while (response === null) {
  await sleep(1000);
  webhookResponse = await MpesaModel.findOne({
    conversationId: data.ConversationID,
  });
  
}

睡眠函数应该相当简单(我们只使用它来等待一秒钟,直到下一个查询):

代码语言:javascript
运行
复制
const sleep = (timeInMilliseconds) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(), timeInMilliseconds);
  });
};

注意:如果答案始终为空,则while循环将永远运行,因此您可能希望在while中添加另一个条件,以防结果始终为null (可能是最大尝试次数?)。

票数 1
EN

Stack Overflow用户

发布于 2020-10-28 22:29:04

代码语言:javascript
运行
复制
async function getNotNullResponse({conversationId}){
    const webhookResponse = await MpesaModel.findOne({conversationId});
    return webhookResponse || getNotNullResponse({conversationId});
}

//API-1
const sendPaymentRequest = async (req, res) => {
  try {
    const payment_reponse = await axios.post(url, body, config);
    const { data } = payment_reponse;
    console.log("Payment request => ", data);

    //Check result i.e response from http listener
    const webhookResponse = await getNotNullResponse({
      conversationId: data.ConversationID
    });

    console.log('Webhook response => ', webhookResponse); //This is not null

    res.status(200).json({ message: "Send money request", data });
  } catch (error) {
    console.log("Error while making a payment request", error);
    res
      .status(400)
      .json({ message: "Error while send payment request", error: error.data });
  }
};


//API-2 - This is the webhook which receives the response
const saveWebhookB2C = async (req, res) => {
  const { Result } = req.body;
  //console.log('Mpesa webhook data received => ', Result);

  let saveResponse = new MpesaModel({
    ...Result,
  });
  const result = await saveResponse.save();
  console.log('B2c mpesa to kenya saved in db => ', result);
  res.status(200).send();
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64574801

复制
相关文章

相似问题

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