我有一個通過 mongoose 連接到 Mongo 的 lambda 函式。用戶在前端輸入名稱和密碼,lambda 函式搜索用戶是否存在,然后通過 bcrypt 比較加密后的密碼。
現在{<promise pending>},當我 console.log(match) 時,bcrypt 給了我。
但是,我不能簡單地添加等待,因為檢查在承諾中。
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 在這種情況下或者我怎么能以另一種方式撰寫這個函式?謝謝閱讀!
uj5u.com熱心網友回復:
你不能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}),
};
};
uj5u.com熱心網友回復:
你可以在 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 }),
});
}
});
}
}
)
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/495740.html
標籤:javascript 反应 mongodb aws-lambda 承诺
下一篇:將大資料保存在csv檔案中
