Функция возвращает неопределенное значение - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть кое-что, чего я не понимаю.Я пытаюсь получить некоторые данные из моей базы данных, используя модель мангуста.Вот код:

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, у меня появляется undefined .Например, когда я хочу записать result.host или result.tempHash, у меня будет мое значение, а не undefined .

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вы работаете с асинхронным процессом, модели mongoose выполняются асинхронно, т.е. они возвращают обещания, которые выполняются позже, а не мгновенно.Чтобы узнать больше об асинхронном программировании JavaScript, вы можете проверить эти Асинхронные сообщения MDN и обещания

Следующий код сделает то, что вы пытаетесь достичь: .

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");
    }
};
0 голосов
/ 30 декабря 2018

Ваш метод dot ничего не возвращает, поэтому ваш результат undefined .

Начните с того, что метод 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...