gpt4 book ai didi

javascript - 在函数中的 Promise 之间保留变量?

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:31 24 4
gpt4 key购买 nike

在 firebase 功能上,我需要从 Paypal 获取数据并执行 4 件事:

1. returns an empty HTTP 200 to them.
2. send the complete message back to PayPal using `HTTPS POST`.
3. get back "VERIFIED" message from Paypal.
4. *** write something to my Firebase database only here.

我现在所做的有效,但我在 (4) 方面遇到了问题。

   exports.contentServer = functions.https.onRequest((request, response) => {
....

let options = {
method: 'POST',
uri: "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr",
body: verificationBody
};

// ** say 200 to paypal
response.status(200).end();

// ** send POST to paypal back using npm request-promise
return rp(options).then(body => {

if (body === "VERIFIED") {

//*** problem is here!
return admin.firestore().collection('Users').add({request.body}).then(writeResult => {return console.log("Request completed");});
}
return console.log("Request completed");
})
.catch(error => {
return console.log(error);
})

正如你所看到的,当我从 Paypal 获得最终验证时,我尝试使用 admin.firestore().collection('Users').. 写入数据库。

我在编译时收到警告:

Avoid nesting promises 

对于write行。

在 promise 的那个阶段我应该如何以及在哪里放置这个write

最佳答案

据我了解,此 HTTPS 云功能是从 Paypal 调用的。

通过在 HTTP 云函数开头执行 response.status(200).end(); 您将终止它,如 doc 中所述:

Important: Make sure that all HTTP functions terminate properly. Byterminating functions correctly, you can avoid excessive charges fromfunctions that run for too long. Terminate HTTP functions withres.redirect(), res.send(), or res.end().

这意味着在大多数情况下,其余代码根本不会执行,或者函数将在异步工作(即 rp()add() 方法)中间终止

只有当所有异步工作完成时,您才应该向调用者发送响应。以下内容应该有效:

exports.contentServer = functions.https.onRequest((request, response) => {

let options = {
method: 'POST',
uri: "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr",
body: verificationBody
};

// ** send POST to paypal back using npm request-promise
return rp(options)
.then(body => {

if (body === "VERIFIED") {
//*** problem is here!
return admin.firestore().collection('Users').add({ body: request.body });
} else {
console.log("Body is not verified");
throw new Error("Body is not verified");
}

})
.then(docReference => {
console.log("Request completed");
response.send({ result: 'ok' }); //Or any other object, or empty
})
.catch(error => {
console.log(error);
response.status(500).send(error);
});


});

我建议您观看 Doug Stevenson ( https://firebase.google.com/docs/functions/video-series/ ) 发布的关于云函数的官方视频系列,特别是关于 Promises 的第一个视频,标题为“在云函数中使用 HTTP 触发器学习 JavaScript Promises (Pt.1)”。

关于javascript - 在函数中的 Promise 之间保留变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com