对于一段代码来说,这似乎是一种不必要的需求,但在我的例子中,这正是我需要的。我有一个与第三方服务交互的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。
//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();
};
发布于 2020-10-28 22:59:06
只需等待响应不同于null:
let webhookResponse = null;
while (response === null) {
await sleep(1000);
webhookResponse = await MpesaModel.findOne({
conversationId: data.ConversationID,
});
}
睡眠函数应该相当简单(我们只使用它来等待一秒钟,直到下一个查询):
const sleep = (timeInMilliseconds) => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(), timeInMilliseconds);
});
};
注意:如果答案始终为空,则while循环将永远运行,因此您可能希望在while中添加另一个条件,以防结果始终为null (可能是最大尝试次数?)。
发布于 2020-10-28 22:29:04
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();
};
https://stackoverflow.com/questions/64574801
复制相似问题