Node.js API不等待等待
您好,我的API有以下问题 我正在从我的服务调用模型中的函数,如下所示Node.js API不等待等待,node.js,Node.js,您好,我的API有以下问题 我正在从我的服务调用模型中的函数,如下所示 async getAccounts(/*offset = 0, limit = 500,*/ res) { try { let offset = 0; let limit = 500; let result = await this.model.getAllAccounts(offset, limit);
async getAccounts(/*offset = 0, limit = 500,*/ res) {
try {
let offset = 0;
let limit = 500;
let result = await this.model.getAllAccounts(offset, limit);
console.log(result, "Debugger 3");
return res.status(200).json(result);
} catch (error) {
logger.error('AccountsService::getAccounts', 39);
logger.error(error);
return errorHandler(error, res);
}
}
我的models类中的函数看起来像这样
async getAllAccounts(offset, limit) {
// Need to add offset and limit parameters //done
console.log("URL",url);
MongoClient.connect(url, function(err, db) {
if (err) throw err;
logger.log('Query Accounts');
const dbo = db.db("DB_NAME");
dbo.collection('accounts').find({}).skip(offset).limit(limit).toArray(function(err, result) {
if (err) throw err;
db.close();
logger.log("Debugger 2xxx: ",result);
return result;
});
});
}
我遇到的问题是调试器3的输出在调试器2的输出之前
我想我需要等待MongoDB返回的结果,但不知道该怎么做。谁能给我指点路吗?
wait
需要一个异步工作的承诺。目前,由于您的函数返回未定义的
(因为所有函数都没有明确的返回
),等待
得到了未定义
的承诺,该承诺立即得到解决,无需等待。另一方面,dbo
使用回调,而不是承诺;你
您应该这样做(但未经测试):
如果您使用的是2.x版之后的mongo db驱动程序,即所有版本2.x、3.x,MongoClient.connect将在没有回调作为参数传递时返回承诺。 所以你可以做下一件事:
async getAllAccounts(offset, limit) {
// Need to add offset and limit parameters //done
try {
console.log("URL", url);
let db = await MongoClient.connect(url);
logger.log("Query Accounts");
const dbo = db.db("DB_NAME");
const result = await dbo
.collection("accounts")
.find({})
.skip(offset)
.limit(limit)
.toArray();
db.close();
logger.log("Debugger 2xxx: ", result);
return result;
} catch (e) {
throw e;
}
}
getAllAccounts
函数调用未等待的原因<代码>等待仅适用于返回
a承诺
的函数。此处getAllAccounts
不返回promise
,因此请使用promise包装该方法
modul.exports.getAllAccounts = (offset, limit)=> {
// Need to add offset and limit parameters //done
return new Promise((resolve,reject)=>{
console.log("URL",url);
MongoClient.connect(url, function(err, db) {
if (err){
reject(err);
return;
}
logger.log('Query Accounts');
const dbo = db.db("DB_NAME");
dbo.collection('accounts').find({}).skip(offset).limit(limit).toArray(function(err, result) {
if (err){
reject(err);
return;
}
db.close();
logger.log("Debugger 2xxx: ",result);
resolve(result);
});
});
});
}
使用
Promise
您的getAllAccounts函数体进行包装
是否在每次操作中都使用MongoClient.connect?我认为你最好在应用程序启动时连接一次。@SuleymanSah我如何更改它以在整个模型中使用单个mongo客户端?你可以在google或StackOverflow中检查或搜索“mongodb全局连接”。它说未定义不是承诺。我说它未经测试。首先,我没有你的数据库可连接。错误到底在哪里?Debugger 2xxx:
是否已打印?错误在返回承诺处,它是TypeError:undefined不是承诺处的承诺()
抱歉,这里忘记了一个新的
运算符。
modul.exports.getAllAccounts = (offset, limit)=> {
// Need to add offset and limit parameters //done
return new Promise((resolve,reject)=>{
console.log("URL",url);
MongoClient.connect(url, function(err, db) {
if (err){
reject(err);
return;
}
logger.log('Query Accounts');
const dbo = db.db("DB_NAME");
dbo.collection('accounts').find({}).skip(offset).limit(limit).toArray(function(err, result) {
if (err){
reject(err);
return;
}
db.close();
logger.log("Debugger 2xxx: ",result);
resolve(result);
});
});
});
}