繁体   English   中英

承诺 {<pending> } 的 bcrypt 内部承诺

[英]Promise {<pending>} of bcrypt inside promise

我有一个通过 mongoose 连接到 Mongo 的 lambda 函数。 用户在前端输入名称和密码,lambda 函数搜索用户是否存在,然后通过 bcrypt 比较加密后的密码。

现在,当我 console.log(match) 时,bcrypt 给了我{<promise pending>}

但是,我不能简单地添加等待,因为检查在承诺中。

require("dotenv").config();
const mongoose = require("mongoose");
const User = require('../server/models/user');
const bcrypt = require('bcryptjs')

exports.handler = async (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false;
  
  mongoose.connect(`${process.env.MONGO_URI}`,{
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }
  );
  
  let {name, password} = JSON.parse(event.body);

 let fd = await new Promise((res,rej)=>User.findOne(
    {
      name:name,
    },
    (err, user) => {
      if (err) {
        rej({
          statusCode: 500,
          body: JSON.stringify({ msg: err.message }),
        });
      } else {
    //==>    const match = await bcrypt.compare(password, JSON.stringify(user.password)); 

 
        if (match) {
        let statusCode = user && match? 200:405
        res({
          statusCode,
          headers: {
            "Access-Control-Allow-Origin": "*", 
            "Content-Type": "application/json",
          },
          body: JSON.stringify({ user}),
        });
      }
      }
    }
  ));
  return fd
};

所以基本上我怎么能'等待' bcrypt 在这种情况下或者我怎么能以另一种方式编写这个函数? 谢谢阅读!

您不能在那里使用await ,因为它发生的回调不是async函数。

但是,您应该更好地使用可以从findOne获得的承诺:

exports.handler = async (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false;
  
  mongoose.connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  });
  
  const {name, password} = JSON.parse(event.body);
  const user = await User.findOne({name}).exec();
  const match = user && await bcrypt.compare(password, user.password.toString()); 
  if (!match) {
    throw {
      statusCode: 405,
      body: "Invalid user or password",
    }
  }
  return {
    statusCode: 200,
    headers: {
      "Access-Control-Allow-Origin": "*", 
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ user}),
  };
};

你可以在 promise 中链接函数:

let fd = await new Promise((res, rej) =>
  User.findOne(
    {
      name: name,
    },
    (err, user) => {
      if (err) {
        rej({
          statusCode: 500,
          body: JSON.stringify({ msg: err.message }),
        });
      } else {
        bcrypt
          .compare(password, JSON.stringify(user.password))
          .then((match) => {
            if (match) {
              let statusCode = user && match ? 200 : 405;
              res({
                statusCode,
                headers: {
                  "Access-Control-Allow-Origin": "*",
                  "Content-Type": "application/json",
                },
                body: JSON.stringify({ user }),
              });
            }
          });
      }
    }
  )
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM