Javascript 无法将对象从mongodb检索到父函数

Javascript 无法将对象从mongodb检索到父函数,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在尝试访问从mongo collection获取的对象,使其超出其功能范围 以下是我正在做的: function getOldMessage(user) { //this is where i want to store the object var oldMsg = {}; messagedb.findOne({ "room": user.room }, function(err, foundMsg) { if (err) { console.log(err)

我正在尝试访问从mongo collection获取的对象,使其超出其功能范围

以下是我正在做的:

function getOldMessage(user) {
//this is where i want to store the object
var oldMsg = {};
messagedb.findOne({ "room": user.room }, function(err, foundMsg) {
    if (err) {
        console.log(err)
    } else {
        //here i am assigning this foundMsg to my object
        oldMsg = foundMsg;
    }
})
// here this is undefined or an empty object
console.log(oldMsg);
return oldMsg;

}我也有同样的问题。我找不到解决方案,所以我这样解决:

var oldMsg = {};
oldMsg = await messagedb.findOne({ "room": user.room });
console.log(oldMsg);
return oldMsg;
但是,必须将函数更改为异步


希望,这是帮助。

var oldMsg
在getOldMessage的范围内声明,并且在其父范围内无法访问,而您正试图访问它。有关作用域的详细信息,请参阅

Mongoose方法返回承诺,因此您可以使用async/await从mongo检索旧值

const getOldMessage=async user=>messagedb.findOne({“room”:user.room});
const-oldMessage=wait-getOldMessage(someUser);
console.log(旧消息);
或者如果您更喜欢
承诺

const getOldMessage=user=>新承诺((解析、拒绝)=>
messagedb.findOne({“room”:user.room},(err,foundMsg)=>{
如果(错误)返回拒绝(错误);
解决(foundMsg);
})
);
然后(message=>console.log(message));

如果您将
async
放在
getOldMessage
前面,该函数将返回一个承诺而不是值,因此它不会工作。嘿,我正在尝试这样做,它会给我错误,说wait仅在async函数中有效。每当您使用
wait
关键字时,它都需要在异步函数中使用。您有两种选择,将对
getOldMessage
的等待调用包装在一个异步函数中,或者执行承诺路线(我的第二个示例)。@AkhilBisht如果您可以接受此答案,请选择答案旁边的复选标记。