Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么我能';t使用来自Mogoose的console.log输出结果';s Model.find()?_Node.js_Mongodb_Mongoose_Console_Console.log - Fatal编程技术网

Node.js 为什么我能';t使用来自Mogoose的console.log输出结果';s Model.find()?

Node.js 为什么我能';t使用来自Mogoose的console.log输出结果';s Model.find()?,node.js,mongodb,mongoose,console,console.log,Node.js,Mongodb,Mongoose,Console,Console.log,因此,我一直在使用mongoose开发MongoDB,我得到了以下代码,这些代码将包含在var tdb=require('./db.js')中 (代码还有其他部分,但我的重点是search函数) 然后我尝试调用console.log(tdb.search(“all”、“none”、“2”)但它输出未定义。但是如果我在返回行上方添加console.log(rdata),它将注销正确的响应,而代码console.log(tdb.search(“all”、“none”、“2”)仍然返回未定义的 我不知

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

(代码还有其他部分,但我的重点是
search
函数)

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


我不知道为什么。我想到了一个可能发生的问题,那就是流程顺序不正确,这发生在
fs
中,并通过promise修复。但我不认为这是问题所在,因为我在
post.find()
的回调中返回了值,我完全被卡住了。不知道其他人哪里会出错?

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

另外,find是异步的。如果从exec中删除回调,那么它应该返回一个承诺。然后,您可以链接一个然后并返回该承诺:

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;
    });
}
…然后您应该能够在承诺解决时使用然后记录结果:

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

另一种方法是将回调函数传递给搜索函数,然后在准备就绪时使用数据调用该函数:

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);
});


我希望这能有所帮助。

它返回了
TypeError:无法读取未定义的属性“then”
抱歉,没有意识到您在那里有回调,因此它不会返回承诺。尝试在搜索函数中从exec中删除回调,并改用then。我已经更新了我的答案。如果你想使用回调而不是承诺,我已经添加了另一个选项。这两种方法都有效,但是有没有办法同步呢?所以我可以直接在
console.log(tdb.search())
中使用它。或者它只能通过回调或承诺来完成?这是一个异步操作,因此您无法以同步方式处理它。它必须从数据库中获取数据。在此期间,您不会希望阻止您的应用程序。
tdb.search("all", "none", "2", (data) => {
  console.log(data);
});