为什么我无法从Mogoose的Model.find()使用console.log输出结果?

时间:2018-09-14 17:24:48

标签: node.js mongodb mongoose console console.log

所以我一直在使用mongoose开发MongoDB,并且我得到了以下代码,这些代码将包含在var tdb = require('./db.js');

// ./db.js
module.exports = {
    update: function(data) {
        post.findOne({slug:data.slug}, (err, res) => {
            if(err) {
                post.create(data, (err, res) => {})
            } else {
                post.updateOne({slug:data.slug}, data, (err, res) => {})
            }
        })
    },
    search: function(ftype, fval, fkey) {
        var query = {};
        if(ftype != "all") {
            query[ftype] = fval;
        }
        post.find(query).lean().exec((err, res) => {
            var keys = Object.keys(res);
            var index = keys.indexOf(fkey);
            var rdata = res[fkey];
            rdata.next = res[keys[index + 1]];
            rdata.prev = res[keys[index - 1]];
            return rdata;
        })
    }
}

(代码也有其他部分,但我主要关注search函数)

然后我尝试调用console.log(tdb.search("all", "none", "2"));,但它输出undefined。但是,如果我在返回行上方添加console.log(rdata),它将注销正确的响应,而代码console.log(tdb.search("all", "none", "2"));仍返回undefined

我不知道为什么。我想到了一个可能发生的问题,即流程顺序不正确,发生在fs上,并已通过承诺解决。但是我不认为这是问题,因为我在post.find()的回调函数中返回了值,这比我完全陷入僵局。不知道其他人会出错吗?

1 个答案:

答案 0 :(得分:1)

您的搜索功能不返回任何内容,因此默认情况下为未定义

发现也是异步的。如果您从 exec 中删除了回调,那么它应该返回一个Promise。然后,您可以链接然后,然后返回该承诺:

search: function(ftype, fval, fkey) {
  var query = {};
  if (ftype != "all") {
    query[ftype] = fval;
  }

  return post
    .find(query)
    .lean()
    .exec()
    .then(res => {
      var keys = Object.keys(res);
      var index = keys.indexOf(fkey);
      var rdata = res[fkey];
      rdata.next = res[keys[index + 1]];
      rdata.prev = res[keys[index - 1]];
      return rdata;
    });
}

...然后,当您使用 then 然后解决承诺时,您应该能够记录结果:

tdb
  .search("all", "none", "2")
  .then(data => console.log(data));

您可以执行的另一种方法是将回调函数传递给 search 函数,然后在准备就绪时将其与数据一起调用:

search: function(ftype, fval, fkey, callback) {
  var query = {};
  if (ftype != "all") {
    query[ftype] = fval;
  }

  post.find(query).lean().exec((err, res) => {
    var keys = Object.keys(res);
    var index = keys.indexOf(fkey);
    var rdata = res[fkey];
    rdata.next = res[keys[index + 1]];
    rdata.prev = res[keys[index - 1]];

    callback(rdata);
  });
}

...然后您应该能够记录您的回调函数的结果:

tdb.search("all", "none", "2", (data) => {
  console.log(data);
});

我希望这会有所帮助。