Mongo DB получает несколько данных о сборе документов за один вызов API - PullRequest
0 голосов
/ 10 марта 2019

У меня есть три функции MongoDB для возврата разных коллекций.

    // 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}

спасибо.

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Я предлагаю вам преобразовать ваши функции в базовую функцию 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);
    })
});

Вы можете найти больше информации о Promise и о том, как создать функцию, основанную на обещаниях, из Mozilla Link и Google Link

0 голосов
/ 10 марта 2019

Добро пожаловать в ад (callback hell).Если вы предпочитаете стиль обратного вызова, вы можете использовать асинхронную библиотеку , она имеет функцию 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> = 8.15, вы можете использовать util.promisify для преобразования функции обратного вызова в Promise, тогда вы можете использовать их с синтаксисом Promise или синтаксисом async/await.

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);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...