如何解决nodejs在全局范围内启用异步函数返回值
let pwd;
async function getSecret() {
const [version] = await smClient.accessSecretVersion({
name: pgpwd
});
const pwd = version.payload.data.toString();
console.log(`in ${pwd}`);
return pwd;
}
promise1 = getSecret().then((pwd) => console.log(`promise then ${pwd}`) );
console.log(promise1.then((pwd) => console.log(`promise1 ${pwd}`)));
console.log(`global scope pwd ${pwd}`);
app.get('/pwd',(req,res) => {
console.log(`get ${pwd}`);
res.send(`pwd = ${pwd}!`);
});
我收到了promise中的值。然后,但是它在全局范围内未定义。
2020-09-20 11:27:00.909 > node index.js
2020-09-20 11:27:00.909
2020-09-20 11:27:02.152 GET200363 B2 sPostmanRuntime/7.26.5 https://nodejs1-
2020-09-20 11:27:03.379 get undefined
2020-09-20 11:27:03.445 in 123456
2020-09-20 11:27:03.445 promise then 123456
2020-09-20 11:27:03.445 promise1 undefined
2020-09-20 11:27:04.634 get undefined
解决方法
您根本不需要全局变量。同时使您的GET请求回调35101
和async
成为您的await
函数在回调中的结果。
如果执行getSecret
是昂贵的函数,则可以用一个闭包将函数包装起来,并在其中存储getSecret
值。然后在调用该函数时,它会检查{{1 }}已被调用并调用过。或者,在调用之前,只需返回结果即可,而不必再次调用pwd
。
getSecret
,
这没有魔术。您只需要分配它:
let pwd; // global
// ...
getSecret().then((localPwd) => { // renamed to something different so that we
// don't shadow (hide) the global pwd
console.log(`promise then ${localPwd}`);
pwd = localPwd; // assign to global variable
})
就是这样。这只是一个变量分配。没有什么比这更复杂了。
当然,这样做意味着在getSecret()
返回全局pwd
的值之前,您的应用启动前几毫秒仍未定义。而且,如果您此时恰巧执行get请求,您将变得不确定。但是在那之后它将具有您期望的价值。只要您对此限制没有问题,那么您在做什么就不会有什么毛病。
但是,如果您不希望进程回答该获取请求,则必须在getSecret()
返回之前定义该获取请求。通常我会亲自编写如下代码:
getSecret().then((pwd) => {
console.log(`promise then ${pwd}`);
// ALL other app logic such as `get` definitions
// are done inside the promise then:
app.get('/pwd',(req,res) => {
console.log(`get ${pwd}`);
res.send(`pwd = ${pwd}!`);
});
});
如果您不希望then
函数太长,则可以将应用程序逻辑封装在另一个函数中。这并不是什么新鲜事物,C / C ++的main()
函数具有以下功能:
let pwd;
function init () {
app.get('/pwd',res) => {
console.log(`get ${pwd}`);
res.send(`pwd = ${pwd}!`);
});
}
getSecret().then((localPwd) => {
console.log(`promise then ${localPwd}`);
pwd = localPwd;
init(); // start the app
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。