我用一个非常简单明了的JS代码遇到了一个奇怪的问题。在这里,我试图根据数据库查找给定的(电子邮件)值,如果存在具有该值的记录,则返回布尔值true:
// utils/isEmailInDB.js
import User from '../models/user';
const isEmailInDB = (email) => {
let emailExists;
User.findOne({ emails: email }).then((existingUser) => {
if(existingUser) { emailExists = true; } else { emailExists = false; }
});
return emailExists;
};
export default isEmailInDB;
在另一个文件中,我正在调用此函数并将返回的值记录到屏幕上:
// routes/mail-routes.js
import express from 'express';
import sendEmail from '../utils/sendEmail';
import isEmailInDB from '../utils/isEmailInDB';
import { check, validationResult } from 'express-validator';
const router = express.Router();
router.post('/', [
check('to').isEmail(),
], (req, res) => {
const errors = validationResult(req);
const { to = '', pageURL = '/' } = req.body;
if (!errors.isEmpty()) {
res.redirect(pageURL + '?verify=1');
} else {
// Generate token
// Check if email exists in db
const existsInDB = isEmailInDB(to);
console.log('EMAIL EXISTS?', existsInDB);
sendEmail(to).then(() => {
res.redirect(pageURL + '?verify=2');
}).catch((err) => {
res.redirect(pageURL + '?verify=1');
});
}
});
module.exports = router;
上面第二个代码段中的这一行:console.log('EMAIL EXISTS?', existsInDB);
,我希望在执行时看到以下输出之一,具体取决于电子邮件是否存在于数据库中:
存在电子邮件吗?是
存在电子邮件吗?错误
但是,无论我尝试什么,该行都会不断返回 undefined 。即使存在正在查找的电子邮件。我可能做错了什么?
答案 0 :(得分:2)
您需要将Promises或asyn-await
与isEmailInDB
函数一起使用,因为它不会等待User.find
完成。另外,当您调用该函数时,它也不再等待异步函数完成。
const isEmailInDB = async (email) => {
const existingUser = await User.findOne({ emails: email });
return !!existingUser;
};
在路线上:
router.post('/', [
check('to').isEmail(),
], async (req, res) => {
.
.
const existsInDB = await isEmailInDB(to);
.
.
});
答案 1 :(得分:1)
您将变得不确定,因为return语句将立即执行,而此时existingUser
是不确定的。相反,您可以返回一个true或false值的诺言,并在邮件路由文件中使用此诺言。
更新您的isEmailInDB
代码。
// utils/isEmailInDB.js
import User from '../models/user';
const isEmailInDB = (email) => {
let emailExists;
return User.findOne({ emails: email })
.then((existingUser) => {
return { emailExists = !!existingUser };
});
};
export default isEmailInDB;
,而在您的邮件路由中,请改用此
const existsInDB = isEmailInDB(to);
existsInDB.then((existsInDB) => {
console.log('EMAIL EXISTS?', existsInDB);
sendEmail(to).then(() => {
res.redirect(pageURL + '?verify=2');
}).catch((err) => {
res.redirect(pageURL + '?verify=1');
});
})