繁体   English   中英

Node JS-返回从Sequelize数据库读取的对象数组的函数

[英]Node js - function to return array of objects read from sequelize database

我正在尝试在节点js中创建一个函数,该函数读取数据库中的值并将其推入数组中,然后最后返回此数组。 目前,我的函数如下所示:

function getInvoicesCount() {
      let promiseInvoices = [];
      let userInvCount = 0;
      let deletedUserInvCount = 0;
      let userInvAmount = 0;
      let deletedUserInvAmount = 0;
      let monthWiseInvCount = [];

      db.userInvoices
        .findAll({
          attributes: [
            'deleted_at',
            [sequelize.fn('COUNT', sequelize.col('id')), 'count'],
            [sequelize.fn('SUM', sequelize.col('invoice_amount')), 'amount'],
            [sequelize.fn('MONTH', sequelize.col('invoice_date')), 'month']
          ],
          group: ['invoice_date', 'deleted_at'],
          paranoid: false
        })
        .then(result => {
          result.forEach(function(element) {
            userInvCount += element.dataValues.count;
            userInvAmount += element.dataValues.amount;
            if (element.dataValues.deleted_at != null) {
              deletedUserInvAmount += element.dataValues.amount;
              deletedUserInvCount += element.dataValues.count;
            }
            monthWiseInvCount.push(element.dataValues);
          });
          if (monthWiseInvCount.map(a => a === 'deleted_at')) {
            monthWiseInvCount.map(a => delete a.deleted_at);
          }
          promiseInvoices.push(
            userInvCount,
            userInvAmount,
            deletedUserInvCount,
            deletedUserInvAmount,
            monthWiseInvCount
          );
        });
      return promiseInvoices;
    }

在代码的主要部分中,我想调用此函数并使用.then来获取返回的数组。

您能帮我解决如何在函数中返回promise,以及如何在.then部分访问数组吗?

这是您需要做的更改才能获得预期的结果:

function getInvoicesCount() {
    ...
    return  db.userInvoices.findAll({ //<-------- 1. First add return here
        ...
    }).then(result => {
        ...
        return promiseInvoices; //<----------- 2. Put this line inside the then
    });
    // return promiseInvoices; //<----------- Remove this line from here    
}

getInvoicesCount().then(data => {
    console.log(data); // <------- Check the output here
})

对此的说明:

要获得.then当您可以使用函数时,函数应该返回promise ,但是在您的情况下,您只是返回一个空白数组,

根据序列化文档, db.userInvoices.findAll返回promise,因此您所需要做的就是在this函数之前添加return ,完成第一步

您是return promiseInvoices; 在错误的地方,为什么呢? ,因为您永远都不会得到结果,因为上面的代码按承诺的那样以异步方式运行,所以您将始终获得balnk数组,要获得预期的结果,您应该从db.userInvoices.findAll '返回then按上面的代码所示运行

您应该从那时返回结果以在链中访问它。

function getInvoicesCount() {
  const promiseInvoices = []
  let userInvCount = 0
  let deletedUserInvCount = 0
  let userInvAmount = 0
  let deletedUserInvAmount = 0
  const monthWiseInvCount = []

  return db.userInvoices
    .findAll({
      attributes: [
        'deleted_at',
        [sequelize.fn('COUNT', sequelize.col('id')), 'count'],
        [sequelize.fn('SUM', sequelize.col('invoice_amount')), 'amount'],
        [sequelize.fn('MONTH', sequelize.col('invoice_date')), 'month'],
      ],
      group: ['invoice_date', 'deleted_at'],
      paranoid: false,
    })
    .then((result) => {
      result.forEach((element) => {
        userInvCount += element.dataValues.count
        userInvAmount += element.dataValues.amount
        if (element.dataValues.deleted_at != null) {
          deletedUserInvAmount += element.dataValues.amount
          deletedUserInvCount += element.dataValues.count
        }
        monthWiseInvCount.push(element.dataValues)
      })
      if (monthWiseInvCount.map(a => a === 'deleted_at')) {
        monthWiseInvCount.map(a => delete a.deleted_at)
      }
      return promiseInvoices.push(
        userInvCount,
        userInvAmount,
        deletedUserInvCount,
        deletedUserInvAmount,
        monthWiseInvCount,
      )
    })
}

您现在可以使用

getInvoicesCount().then(() => {
  //do something here
})
getData(htmlData,tags)
.then(function(data) { 
     console.log(data); //use data after async call finished
})
.catch(function(e) {
    console.log(e);
});

function getData() {
  return new Promise(function(resolve, reject) {
    //call async task and pass the response
    resolve(resp); 
  });
}

通常,您可以返回如下承诺:

function returnPromise() {
    return new Promise((resolve, reject) => {
        resolve({foo: 'bar'});
    });
}

因此,当另一个答案完全正确时,您可以使用上面的结构来创建一个返回如下承诺的函数:

function getInvoicesCount() {
  return new Promise((resolve, reject) => {
    let promiseInvoices = [];
    let userInvCount = 0;
    let deletedUserInvCount = 0;
    let userInvAmount = 0;
    let deletedUserInvAmount = 0;
    let monthWiseInvCount = [];

  db.userInvoices
    .findAll({
      attributes: [
        'deleted_at',
        [sequelize.fn('COUNT', sequelize.col('id')), 'count'],
        [sequelize.fn('SUM', sequelize.col('invoice_amount')), 'amount'],
        [sequelize.fn('MONTH', sequelize.col('invoice_date')), 'month']
      ],
      group: ['invoice_date', 'deleted_at'],
      paranoid: false
    })
    .then(result => {
      result.forEach(function(element) {
        userInvCount += element.dataValues.count;
        userInvAmount += element.dataValues.amount;
        if (element.dataValues.deleted_at != null) {
          deletedUserInvAmount += element.dataValues.amount;
          deletedUserInvCount += element.dataValues.count;
        }
        monthWiseInvCount.push(element.dataValues);
      });
      if (monthWiseInvCount.map(a => a === 'deleted_at')) {
        monthWiseInvCount.map(a => delete a.deleted_at);
      }
      promiseInvoices.push(
        userInvCount,
        userInvAmount,
        deletedUserInvCount,
        deletedUserInvAmount,
        monthWiseInvCount
      );
      resolve(promiseInvoices); // When you are done, you resolve
    })
    .catch(err => reject(err)); // If you hit an error - reject
});
}

但是,这是一个相当大的功能,建议将其分成较小的部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM