我有一个 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/