猫鼬异步/等待问题

时间:2020-06-25 18:12:40

标签: node.js mongoose promise async-await

嗨,我正在调试我的应用程序,但是卡住了,我认为在异步函数中如何正确处理猫鼬的事情我还不太了解。

所以我的主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

4 个答案:

答案 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)

       })
  })
}