代码之家  ›  专栏  ›  技术社区  ›  Supun Abesekara

Mongo DB在一个API调用中获取多个文档收集数据

  •  0
  • Supun Abesekara  · 技术社区  · 6 年前

        // mongo DB models/user
        module.exports.countUsers = function (callback) {
        User.findOne().where({ 'status': 1}).count(callback);
        }
    
       // mongo DB models/Cars
        module.exports.countCars = function (callback) {
        Car.findOne().where({ 'status': 1}).count(callback);
        }
    
       // mongo DB models/orders
        module.exports.countOrders = function (callback) {
        Order.findOne().where({ 'status': 1}).count(callback);
        }
    

    问题是我需要将所有数据合并到一个GET API调用中。

    User = require('./models/user');
    Cars = require('./models/cars');
    Orders = require('./models/orders');
    
    app.get('/userInfo', function(req, res) {
      let outPut = {}
      //get  data from  mongo db 
      User.countUsers(function(err, count) {
        //A
        console.log(count);
      outPut.coutUsers = count;
      });
      Cars.countCars(function(err, count) {
        //B
        console.log(count);
          outPut.coutCars = count;
      });
      Orders.countOrders(function(err, count) {
        //C
        console.log(count);
          outPut.coutOrders = count;
      });
      
    
      
      
      
      res.status(200);
      res.json(outPut);
    });

    outPut.coutUsers = '';
    outPut.coutCars = '';
    outPut.coutOrders = '';
    

    我试了一些方法,但没有运气。

    {} ,但我需要 {coutUsers:10,countCars:10,countOrders :10}

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   csurapich    6 年前

    我建议您将函数转换为Promise基函数。

    转换之后,剩下的唯一事情是像下面这样链接命令

    User = require('./models/user');
    Cars = require('./models/cars');
    Orders = require('./models/orders');
    
    app.get('/userInfo', function(req, res) {
      let outPut = {}
    
      /*
       * Get data from MongoDB
       */
    
      // A
      User.countUsers()
        .then(count => {
          outPut.coutUsers = count;
    
          // B
          return Cars.countCars();
        })
        .then(count => {
          outPut.coutCars = count;
    
          // C
          return Orders.countOrders();
        })
        .then(count => {
          outPut.coutOrders = count;
    
          // Finally return a response
          res.status(200);
          res.json(outPut);
        })
        .catch(err => {
          // Catch errors in between the chains
          // Return server error (Depends on your way)
          res.status(500);
        })
    });
    

    Mozilla Link Google Link

        2
  •  0
  •   hoangdv    6 年前

    欢迎来到地狱( callback hell ). 如果您喜欢回调样式,可以使用 async library ,它有 parallel

    或者您可以将函数转换为Promise,然后可以通过Promise语法或 async/await 语法(推荐)。

    什么是回拨?

    User = require('./models/user');
    Cars = require('./models/cars');
    Orders = require('./models/orders');
    
    app.get('/userInfo', function (req, res) {
      let outPut = {}
      //get  data from  mongo db 
      User.countUsers(function (err, count) {
        //A
        console.log(count);
        outPut.coutUsers = count;
    
        Cars.countCars(function (err, count) {
          //B
          console.log(count);
          outPut.coutCars = count;
    
          Orders.countOrders(function (err, count) {
            //C
            console.log(count);
            outPut.coutOrders = count;
    
            res.status(200);
            res.json(outPut);
          });
        });
      });
    });
    

    如果使用nodejs verions>=8.15的node,则可以使用 util.promisify 异步/等待 语法。

    const promisify = require('util').promisify;
    
    app.get('/userInfo', async function (req, res) {
      //get  data from  mongo db
      let coutUsersPromise = promisify(User.countUsers)();
      let coutCarsPromise = promisify(Cars.countCars)();
      let countOrdersPromise = promisify(Orders.countOrders)();
    
      try {
        let [coutUsers, coutCars, countOrders] = [ // Run the tasks collection of functions in parallel, without waiting until the previous function has completed.
          await coutUsersPromise,
          await coutCarsPromise,
          await countOrdersPromise,
        ];
    
        let outPut = {
          coutUsers: coutUsers,
          countCars: coutCars,
          countOrders: countOrders,
        };
    
        res.status(200);
        res.json(outPut);
      } catch(err) {
        // Error
        res.status(400);
        res.json(err);
      }
    });