函数返回一个未定义的值

时间:2018-12-27 07:30:25

标签: javascript node.js express mongoose

我有一些我不理解的东西。我尝试使用猫鼬模型从数据库中获取一些数据。这是代码:

function dot(property) {
  const result = Temp.findOne({tempHash: property}).exec( (er,result) =>  result);
}

function verify(req,res,next) {
 console.log(dot(req.query.id), dot(req.query.id));

 if (req.get('host') == dot(req.query.id).host) {
    console.log("Domain is matched. Information is from Authentic email");

    if(req.query.id == dot(req.query.id).tempHash) {
      // ...

我的dot函数获取值,当我在console.log回调中使用exec时,我有一个完整的对象(结果)。

但是当我尝试从verify函数访问对象的属性时,我有一个未定义。例如,当我想登录result.hostresult.tempHash时,我将拥有我的值,而不是 undefined

2 个答案:

答案 0 :(得分:1)

您的dot方法不返回任何内容,这就是为什么结果为未定义的原因。

首先使dot方法返回结果:

async function dot(property) {
  return Temp.findOne({ tempHash: property });
}

现在dot返回一个Promise,您只需要调用该方法然后等待结果即可:

function verify(req, res, next) {
  dot(req.query.id)
    .then(result => {
      if (!result) return;

      if (req.get('host') === result.host) {
        console.log("Domain is matched. Information is from Authentic email");
        if (req.query.id === result.tempHash) { // this condition is useless
          // ...
        }
      }
    })
    .catch(next);
}

答案 1 :(得分:1)

您正在使用异步过程,猫鼬模型是异步执行的,即它们返回的Promise将在以后而不是立即执行。要了解有关JavaScript异步编程的更多信息,可以查看此MDN async postpromises

以下代码将完成您要实现的目标:

const dot = function(property) {
    return Temp.findOne({tempHash: property}).exec();
};

const verify = async function(req, res, next) {
    //note that result can be null when no match exists in the db
    const result = await dot(req.query.id);
    if (result && req.get('host') == result.host) {
        console.log("Domain is matched. Information is from Authentic email");
    }
};