如何从Node.js中的异步函数返回值

时间:2019-05-05 14:30:20

标签: node.js

我具有应该用于验证用户身份并返回WT令牌的功能:

async function authenticate({username, password}) {

    userModel.find({username: username, password: password}, (err, doc) => {
      if (doc[0]) {

        const user = {
            id: doc[0]._id,
            username: doc[0].username,
            password: doc[0].password,
            firstName: doc[0].firstName,
            lastName: doc[0].lastName,
            role: doc[0].role
        };

        const token = jwt.sign({sub: user.id, role: user.role}, config.secret);
        const {password, ...userWithoutPassword} = user;
        return {
            ...userWithoutPassword,
            token
        };
    }
  });
}

userModel是猫鼬模型。最后的return语句似乎不返回任何内容,而是在其中执行console.log,正确填充了值。我想念什么吗?我是第一次尝试使用node,因此如果不清楚,请询问。

我签出了以前建议的解决方案,但是我不知道如何将其应用于我的具体情况。

3 个答案:

答案 0 :(得分:0)

将用户模型包装在Promise中,然后就可以等待它

async function authenticate({ username, password }) {
  return await new Promise(function(resolve) {
    userModel.find({ username: username, password: password }, (err, doc) => {
      if (doc[0]) {
        const user = {
          id: doc[0]._id,
          username: doc[0].username,
          password: doc[0].password,
          firstName: doc[0].firstName,
          lastName: doc[0].lastName,
          role: doc[0].role
        };

        const token = jwt.sign(
          { sub: user.id, role: user.role },
          config.secret
        );
        const { password, ...userWithoutPassword } = user;
        resolve({
          ...userWithoutPassword,
          token
        });
      }
    });
  });
}

答案 1 :(得分:0)

您需要使用async和await而不是使用回调:-

async function authenticate({username, password}) {
  try {
    const doc = await userModel.findOne({username: username, password: password});
   if (doc) {

        const user = {
            id: doc._id,
            username: doc.username,
            password: doc.password,
            firstName: doc.firstName,
            lastName: doc.lastName,
            role: doc.role
        };

        const token = jwt.sign({sub: user.id, role: user.role}, config.secret);
        const {password, ...userWithoutPassword} = user;
        return {
            ...userWithoutPassword,
            token
        };
    }
  } catch(err) {
    // handle error
  }
}

答案 2 :(得分:0)

  

猫鼬5.0在默认情况下会使用本地承诺,   否则没有承诺。您仍然可以设置自定义承诺   库使用mongoose.Promise = require('bluebird');但是,   mpromise将不受支持。

Mongoose 5.x

async function authenticate({ username, password }) {

  let doc = await userModel.find({ username: username, password: password }).exec(); // exec() convert query to a native Promise.

  if (doc[0]) {

    const user = {
      id: doc[0]._id,
      username: doc[0].username,
      password: doc[0].password,
      firstName: doc[0].firstName,
      lastName: doc[0].lastName,
      role: doc[0].role
    };

    const token = jwt.sign({ sub: user.id, role: user.role }, config.secret);
    const { password, ...userWithoutPassword } = user;
    return {
      ...userWithoutPassword,
      token
    };
  }
  // else ?
  return null;
}