查找Mongo集合,不断返回未定义

时间:2019-08-12 09:13:51

标签: javascript node.js mongoose

我用一个非常简单明了的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 。即使存在正在查找的电子邮件。我可能做错了什么?

2 个答案:

答案 0 :(得分:2)

您需要将Promises或asyn-awaitisEmailInDB函数一起使用,因为它不会等待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');
  });
})