javascript - 查找 Mongo 集合,始终返回未定义

标签 javascript node.js mongoose

我遇到了一个非常简单直接的 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-awaitisEmailInDB 函数一起使用,因为它不会等待 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/

相关文章:

javascript - 创建要添加的函数,使得 add(1,2)(3,...k)(1,2,3)...(n) 应该对所有数字求和

javascript - URL 在 Postman 中有效,但在 Nodejs 中无效

node.js - 从电子邮件回复中删除原始消息

Node.js 无缘无故以 "Sending SIGTERM to child"停止

javascript - 如何通过分配测试组件中可观察的服务

javascript - 如何设置一个元素,以便它使用父元素的剩余高度同时包含其他 2 个动态元素?

javascript - 使用 Mongoose 从 MongoDB 检索数据不起作用

node.js - 当我们在nodejs中使用mongoose从mongodb中选择复杂对象时,有什么方法可以重命名路径吗?

javascript - 如何使用 mongoose 从 MongoDb 获取数据?

javascript - 函数与变量之比的原因是什么?