所以我一直在使用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()
的回调函数中返回了值,这比我完全陷入僵局。不知道其他人会出错吗?
答案 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);
});
我希望这会有所帮助。