我遇到了一个非常简单直接的 JS 代码的奇怪问题。在这里,我尝试根据数据库查找给定(电子邮件)值,如果存在具有该值的记录,则返回 bool 值 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);
,我希望在执行时看到以下输出之一,具体取决于电子邮件是否存在于数据库中:
EMAIL EXISTS? true
EMAIL EXISTS? false
但是,无论我尝试什么,该行都会返回未定义。即使正在查找的电子邮件存在。我可能做错了什么?
最佳答案
您需要将 Promises 或 asyn-await
与 isEmailInDB
函数一起使用,因为它不会等待 User.find
完成。此外,当您调用该函数时,它也不再等待异步函数完成。
const isEmailInDB = async (email) => {
const existingUser = await User.findOne({ emails: email });
return !!existingUser;
};
在 route :
router.post('/', [
check('to').isEmail(),
], async (req, res) => {
.
.
const existsInDB = await isEmailInDB(to);
.
.
});
关于javascript - 查找 Mongo 集合,始终返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57458421/