首页 > 解决方案 > 如何使用 forEach 和 Mongoose 查询计算最终价格?

问题描述

我对 Mongoose Queries 有一个困难的最终价格计算问题。我有三个功能。这个得到一个ID和外部数量,找到材料价格,最后乘以它。

async function getPrivatePrice(id, quantity) {
  try {
    let piece = await Piece.findOne({'_id': id}).select({"meterage": 1, "material": 1, "_id" : 0}).then((piece) => {
      return piece;
    }).catch((err) => {
      console.log(err);
    });

    let price = await Material.findOne({'_id': piece.material}).select({"_id" : 0, "price" : 1}).then((price) => {
      return price;
    }).catch((err) => {
      console.log(err);
    });
    let final_raw = piece.meterage * price.price;
    let final_price = final_raw * quantity;
    return { final_price : final_price }

  } catch(err) {
    console.log(err);
  }
}

我真的对代码的第二部分有困难,因为我需要从另一个函数中获取许多 id,所以,我决定使用 forEach 来调用这个函数,并获取所有这些价格并将它们放入一个数组中,但我不知道如何退货。

async function getFinalCost(pieces) {
  let total_cost = [];
  try {
    pieces.forEach(async (response) => {
      let query = await PieceController.getPrivatePrice(response["_id"], response["quantity"]).then((piecePrice) => {
        return piecePrice["final_price"];
      }).catch((err) => {
        console.log(err);
      });
      total_cost.push(query);
    });
    return total_cost;

  } catch(err) {
    console.log(err);
  }
}

我想知道如何在这里获取该数组:

function createProduct(req, res) {

  let params = req.body;
  let product = new Product();
  product.name = params.name;
  product.reference = params.reference;
  product.pieces = params.pieces;
  product.color = params.color;
  let piece_price = getFinalCost(product.pieces);
  console.log(piece_price); //Outputs Promise { { total_array: [] } }
}

标签: javascriptnode.jsmongoose

解决方案


你显然需要重构你的代码。我要做的是使用像 bluebird 这样的东西在片段列表上运行地图。

const Promise = require('bluebird');

async function getMoreProductInfo(id) {
    try{
        const productInfo = await Piece.findOne({'_id': id}).select({"meterage": 1, "material": 1, "_id" : 0});
        const materialInfo = await Material.findOne({'_id': productInfo.material}).select({"_id" : 0, "price" : 1});
        return { productInfo, materialInfo };
    } catch(e) {
        throw e;
    }
}

async function calculatePrices(pieces) {
    try {
        const priceList = await Promise.map(pieces, async (piece) => {
            const { productInfo, materialInfo } = await getMoreProductInfo(piece._id);
            return materialInfo.price * piece.quantity * productInfo.meterage;
        });
        return priceList
    } catch (e) {
        throw e;
    }
}

我显然无法按原样测试此代码..但我认为告诉发生了什么应该很简单(我认为)


推荐阅读