![](/img/trans.png)
[英]How to return values from mongoose findOne method to the calling function
[英]How to return object from MongoDb database in findOne method
对不起,如果这很容易出错,我在 JS 方面没有太多经验,我尝试了很多方法,但我无法解决这个问题。
我可以从数据库中找到并打印我的 object,但我无法将其返回到我的主要方法。
我的主要方法(它在另一个文件中,而不是数据库方法):
(async () => {
try{
const someClass = new SomeClass();
const object = await someClass.database.getFirstObjectFromBase("collectionName");
console.log(object);
} catch (err) {
console.log(err);
}
})();
并且(在尝试调试之前)我的“对象”是未定义的。 看看我用过的两种方法:
async connectAndReturnWithFunction(func) {
return new Promise(
function(resolve, reject){
mongoClient.connect(url, {}, (error, client) => {
if (error) {
console.log("Cannot connect to db");
} else {
console.log("Database connection established: " + dbname);
};
const db = client.db(dbname);
return func(db);
}
);
}
)
}
最后:
async getFirstObjectFromBase(collection) {
return await this.connectAndReturnWithFunction(function(db) {
return db.collection(collection)
.findOne({}, function(err, result) {
console.log(result);
return result;
})
})
}
我也用“then”尝试了一些东西:
async getFirstObjectFromBase(collection) {
return await this.connectAndReturnWithFunction(function(db) {
return db.collection(collection)
.findOne({})
.then(result => {
console.log(result);
return result;
});
})
}
在 getFirstObjectFromBase console.log(result) 的两个示例中,打印良好的 object,但程序在此之后停止,我无法将此 JSON 返回到主方法。
谢谢你的建议:)
您的代码中的问题:
在connectAndReturnWithFunction
function 内部,你永远不会调用resolve()
async
函数始终返回Promise
,因此您无需使用Promise
构造函数自己创建一个。 您永远不会在connectAndReturnWithFunction
function 中使用await
关键字,因此无需将其设为async
。
在connectAndReturnWithFunction
function 内部,在 mongoClient.connect 的回调mongoClient.connect
内部,如果出现错误,您会记录一条消息,指示无法建立与数据库的连接,但最后两行代码
const db = client.db(dbname); return func(db);
仍将执行。 您可能打算在else
块中添加这两行。
mongoClient.connect(url, {}, (error, client) => { if (error) { console.log("Cannot connect to db"); } else { console.log("Database connection established: " + dbname); const db = client.db(dbname); return func(db); } }
未定义object
的原因是因为在connectAndReturnWithFunction
内部,您永远不会调用resolve()
,这是使用数据库中的数据解析Promise
所必需的。
要解决此问题,请将resolve()
和reject()
函数传递给connectAndReturnWithFunction
function 的回调 function。
return func(db);
至
func(db, resolve, reject);
在getFirstObjectFromBase
function 中,调用resolve()
function,将result
作为参数传递。 如果出现错误,调用reject()
function,将错误 object 作为参数传入。
async getFirstObjectFromBase(collection) {
return this.connectAndReturnWithFunction(function(db, resolve, reject) {
return db.collection(collection)
.findOne({}, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
})
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.