javascript - Promise 内 bcrypt 的 Promise {<pending>}

标签 javascript reactjs mongodb aws-lambda promise

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

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

但是,我不能简单地添加等待,因为检查位于 promise 内。

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 获得的 promise :

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}),
  };
};

关于javascript - Promise 内 bcrypt 的 Promise {<pending>},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72743063/

相关文章:

javascript - 如何使用 Google V3 map 的集群信息气泡

javascript - 是否建议使用 javascript 构建布局?

javascript - 为什么 req.body 不断返回空对象?

html - 缩放元素时,部分边框在 Firefox 上不可见

c# - 从 MongoDB 数组中删除元素

javascript - 蒙戈错误: cursor killed or timed out - Meteor timeout settings ineffective

javascript - 将包含图像和图案的 SVG 下载为 PDF

javascript - 即使我试图保持文本区域失去焦点

reactjs - 如何使用变量而不是 "disable"单词禁用字段集

c# - 在 Mongodb 中按日期聚合