Mongoose查询返回undefined

时间:2016-06-28 14:50:12

标签: node.js mongoose

我试图通过另一个函数简单地返回查询结果。在下面的示例中,当我调用 gameInit 时,我需要从数据库中获取一个随机字。 grabWord 功能正常,我可以在该功能中记录结果。它回传给gameInit就是问题所在。我知道我需要使用回调但是已经失败了很多次,所以我在这里!

module.exports = {
    gameInit: function(){
        var theWord = module.exports.grabWord();
        console.log(theWord); //returns undefined
    },
    grabWord: function () {
        Word.find({}, function (err, docs){ 
            rand = Math.floor((Math.random() * docs[0].words.length));
            myWord = docs[0].words[rand].word;
            return (myWord); 
            console.log(myWord); // works

        }); 
    }
}

1 个答案:

答案 0 :(得分:2)

您可以将回调函数传递给grabWord

module.exports = {
  gameInit: function() {
    this.grabWord(function(word) {
      console.log('The word is ' + word);
    });
  },
  grabWord: function(cb) {
    Word.find({}, function(err, docs) {
      rand = Math.floor((Math.random() * docs[0].words.length));
      myWord = docs[0].words[rand].word;
      cb(myWord);
    });
  }
}

或者,使用Promises:

module.exports = {
  gameInit: function() {
    var promise = module.exports.grabWord();
    promise.then(function(word) {
      return word;
    }).catch(function(err) {
      console.error('there was an error: ' + err);
    })
  },
  grabWord: function() {
    return new Promise(function(fulfill, reject) {
      Word.find({}, function(err, docs) {
        if (err) {
          reject(err);
        } else {
          rand = Math.floor((Math.random() * docs[0].words.length));
          myWord = docs[0].words[rand].word;
          fullfill(myWord);
        }
      });
    });
  }
}