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