嗨,我正在调试我的应用程序,但是卡住了,我认为在异步函数中如何正确处理猫鼬的事情我还不太了解。
所以我的主server.js具有类似的内容
const user = await userService.authenticate({ username, password });
console.log("user in the main method is ...");
console.log(user);
我还有另一个'userService.js',其内容类似于(简体)
async function authenticate({ username, password }) {
await Users.find({ username: username, password: password }, function(
err,
user
) {
if (err) res.send(err);
if (user) {
console.log("user within the authenticate method is... ");
console.log(user);
return user;
}
});
}
问题出在authenticate
方法内,console.log具有正确的身份验证信息,但是在主server.js中,我得到了不同的值。我怀疑这与我如何使用async和await关键字有关。这就是我从控制台获得的信息
user within the authenticate method is...
[
{
_id: 5ee845ee39fdf73190068308,
username: 'XXXXXX',
firstName: 'XXX',
lastName: 'XXX',
password: 'XXX',
categoryDiscount: [ [Object], [Object] ]
}
]
user in the main method is ...
undefined
答案 0 :(得分:1)
有趣的是,在将authenticate方法修改为以下内容后,它开始工作。
async function authenticate({ username, password }) {
console.log("starting the authenticate method");
const user = await Users.findOne({ username: username, password: password });
if (user) {
console.log("user within the authenticate method is... ");
console.log(user);
return user;
}
}
但是不清楚为什么这种改变会使事情奏效...
答案 1 :(得分:0)
await keywoard仅在异步功能内起作用。不能在外面使用。
async function authenticate({ username, password }) {
Users.find({ username: username, password: password }, function(err, user) {
if (err) res.send(err);
return user;
}
});
}
async function print() {
const user = await userService.authenticate({ username, password });
console.log(user)
}
print()
这将打印出所需的结果。
答案 2 :(得分:0)
在main.js中使用await是可以的,缺少的是您需要在authenticate()中返回一个promise。您不需要使authenticate()异步。
function authenticate({ username, password }) {
return new Promise((res, rej) => {
Users.find({ username: username, password: password }, function(err, user) {
if (err) {
// res.send(err);
rej(err); // this error will need to be caught using try/catch in calling function
} else {
// we resolve the promise as long as no error was returned
console.log("user within the authenticate method is... ");
console.log(user);
//return user;
res(user); // user returned to calling function
}
});
});
}
答案 3 :(得分:0)
Await
用于等待承诺解决。它不会返回或停止执行函数。这里的authenticate
函数不返回任何内容。 V8知道这是一个承诺,但是由于没有回报,因此从await userService.authenticate({ username, password });
解析的值将是undefined
。使用此逻辑,以下代码将起作用
function authenticate({ username, password }) {
return Users.findOne({ username: username, password: password })
}
// or
async function authenticate({ username, password }) {
const user = await Users.findOne({ username: username, password: password })
return user
}
// or
function authenticate({ username, password }) {
return new Promise((resolve,reject) => {
Users.findOne({ username: username, password: password },function(err,user)
{
if(err) return reject(err)
return resolve(user)
})
})
}