[英]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.