Node.js - не выполняются обещания БД перед возвратом ответа - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть этот обработчик запросов на моем сервере узлов.Он имеет три запроса MongoDB, и я хочу, чтобы все результаты были возвращены до отправки ответа.

api.get('/getStats/:productID', (req,res)=>{
  let data = {};
  let dailySales = [];
  let avgProduct = "";
  let customers = [];

  Sales.find({productID: productID}).then(
    sales => {
      dailySales = sales;
    }
  );

  Products.find({}).then(
    products => {
      // Calculate Avg product here
      avgProduct = result;
    }
  );

  Customers.find({}).then(
    customers => {
      customers = customers;
    }
  );

  data = {
    dailySales,
    avgProduct,
    customers
  };

  res.json(data);
});

Но при выполнении этого возвращается

data: {
  dailySales: [],
  avgProduct: "",
  customers: []
}

, т. Е. Ответ Mongo возвращаетсядо запуска данных.Пожалуйста, как мне исправить.Спасибо

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

дождитесь выполнения всех обещаний, прежде чем отправлять фактический ответ

const sales = Sales.find({productID: productID});
const allProducts = Products.find({});
const allCustomers = Customers.find({});

Promise.all([sales, allProducts, allCustomers])
 .then(data => res.json(data));  
0 голосов
/ 23 ноября 2018

Попробуйте использовать встроенную функцию util.promisify вместе с async-await для правильного получения данных!

const promisify = require('utils').promisify;

const salesFindOnePromise = promisify(Sales.find);
const productsFindAllPromise = promisify(Products.find);
const customersFindAllPromise = promisify(Customers.find);

findDailySalesByIdAsync = async (productID) => {

    try {
        return await salesFindOnePromise({ productID: productID });
    } catch(err) {
        throw new Error('Could not fetch the appropriate sales with productID');
    }

}

findProductsAsync = async () => {

    try {
        return await productsFindAllPromise({});
    } catch (err) {
        throw new Error('Could not fetch sales!');
    }
}

findCustomersAsync = async () => {

    try {
        return await customersFindAllPromise({});
    } catch (err) {
        throw new Error('Could not fetch customers!');
    }
}


api.get('/getStats/:productID', async (req,res)=>{

try {
  const dailySales = await findDailySalesByIdAsync(productID);
  const avgProduct = await findProductsAsync();
  const customers = await findCustomersAsync();

    const data = {
        dailySales,
        avgProduct,
        customers
    };

    return res.status(200).send(data);

  } catch(err) {
    console.err(`Failed because: {err}`);
    throw new Error('Could not fetch data because of some error!');
  }

});
0 голосов
/ 23 ноября 2018

вы можете попробовать использовать Promise.all, где вы можете передать запросы MongoDB в качестве параметра к нему, обещание будет выполнено, когда все запросы вернут результат в массиве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...