【问题标题】:my express js response is different with my console.log我的快速 js 响应与我的 console.log 不同
【发布时间】:2021-06-14 17:39:14
【问题描述】:

我有一个返回餐厅优惠的请求

console.log(offers) 在 for 循环中返回我想要的(带有对象的数组)但是当我使用 res.send(offers) 将报价发送给客户端时返回一个空数组

我该怎么办?

offers: async (req, res) => {
    let orders = await req.models.order.find({
      "customers.customer_id": req.user._id,
    });

    let cashbacks = await req.models.cash_backs
      .find()
      .populate("restaurant_id");

    let offers = [];
    for (let i = 0; i < cashbacks.length; i++) {
      orders.forEach(async (order) => {
        if (order.cash_back_id != cashbacks[i]._id) {
          await req.models.order
            .find({
              "customers.customer_id": req.user._id,
              cash_back_id: cashbacks[i]._id,
            })
            .then((result) => {
              let allowCount = cashbacks[i].per_visit.values.length;

              if (allowCount > result.length) {
                offers = [...offers, cashbacks[i]];
                console.log(offers); // return [{..}, {..}, {..}]
              } else {
                return;
              }
            });
        }
      });
    }

    res.send(offers);
  },

【问题讨论】:

  • 关于如何返回异步调用响应的非常经典的问题:stackoverflow.com/questions/14220321/…await 也不能在 .forEach.map 等数组方法中工作(它实际上并不等待)

标签: javascript node.js mongodb express asynchronous


【解决方案1】:

这是因为 res.send(offers) 没有等待 forEach 循环中的所有异步函数完成。

如果您只想在商品填充了一些数据后发送,请尝试调整您的函数以使用for/of 循环而不是forEach 循环。因为 forEach 循环中的回调在它自己的范围内,所以外部函数不会等待 forEach 循环中的所有异步函数完成。这会导致 res.send(offers) 在 offer 填充数据之前运行。通过将循环更改为 for/of 循环,您可以让外部函数在继续之前等待这些调用完成。

offers: async(req, res) => {
  let orders = await req.models.order.find({
    "customers.customer_id": req.user._id,
  });

  let cashbacks = await req.models.cash_backs
    .find()
    .populate("restaurant_id");

  let offers = [];
  for (let i = 0; i < cashbacks.length; i++) {
    for (const order of orders) {
      if (order.cash_back_id != cashbacks[i]._id) {
        await req.models.order
          .find({
            "customers.customer_id": req.user._id,
            cash_back_id: cashbacks[i]._id,
          })
          .then((result) => {
            let allowCount = cashbacks[i].per_visit.values.length;

            if (allowCount > result.length) {
              offers = [...offers, cashbacks[i]];
              console.log(offers); // return [{..}, {..}, {..}]
            } else {
              return;
            }
          });
      }
    }
  }

  res.send(offers);
},

【讨论】:

  • 如果你使用async/await,你应该完全摆脱.then()。要么你 await 某事,要么你使用 .then() 方法,而不是同时使用两者。我知道它是 OP 原始代码的一部分,但这也应该修复。否则这是一个很好的答案
  • @JeremyThille 嗯,我知道它可能会很乱,但它并没有真正改变代码的有效性。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多