我有两个功能都是异步的。我想确保一个接一个被执行以下代码位于异步内
const user= await User.find({
_id: req.user.id
});
const userName= `my user name is ${user.userName}`;
const email= `my email is ${user.email}`;
const {response} = await printUser({userName,email};
问题是在我找到用户之前执行了printUser函数因此userName和email的值是未定义的。
注意:以下代码在快速路由器中,并且查找功能正在运行(正在重现用户)
我假设所有这些代码行也都在异步函数中。
您的问题是,find
返回一个用户数组而不是单个用户,更改
const user= await User.find({
_id: req.user.id
});
收件人:
const user= await User.findOne({
_id: req.user.id
});
如果代码不在函数中而是在主文件中,那么您将必须使用回调。
您需要使用回调。如下所示:
User.find({
_id: req.user.id
}, function (user) {
printUser(user.userName, user.email);
});
根据您提供的代码,看起来User.find
不会返回Promise,因此它将继续进行下一个操作,而无需等待结果。
您可以使用回调方法使它返回Promise
。
const user = await new Promise(result =>
User.find(
{
_id: req.user.id,
},
resolve,
),
);
const userName = `my user name is ${user.userName}`;
const email = `my email is ${user.email}`;
const { response } = await printUser({ userName, email });
假设您是猫鼬,它不会为查询函数返回promise(在此处阅读https://mongoosejs.com/docs/promises.html#queries-are-not-promises)。您可以使用.then
或使用.exec
来返回正确的承诺。像
const user = await (User.find({
_id: req.user.id
})).exec();
const userName= `my user name is ${user.userName}`;
const email= `my email is ${user.email}`;
const {response} = await printUser({userName,email};