Node.js 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);

您好,我的API有以下问题

我正在从我的服务调用模型中的函数,如下所示

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

});

      }