Javascript 如何使用forEach和Mongoose查询计算最终价格?

Javascript 如何使用forEach和Mongoose查询计算最终价格?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有一个困难的最终价格计算问题与猫鼬查询。我有三个功能。这一个得到了一个ID和外部数量,找到了材料的价格,并最终将其叠加 async function getPrivatePrice(id, quantity) { try { let piece = await Piece.findOne({'_id': id}).select({"meterage": 1, "material": 1, "_id" : 0}).then((piece) => { return p

我有一个困难的最终价格计算问题与猫鼬查询。我有三个功能。这一个得到了一个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: [] } }
}

显然,您需要重构代码。我要做的是使用像蓝鸟这样的东西在碎片列表上运行一个地图,就像这样

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

很明显,我无法按原样测试这段代码。但我认为应该非常直接地告诉您发生了什么(我认为)

那么这里的最终目标是什么
pieces
是一个包含
\u id
quantity
值的数组,您需要返回加在一起的总成本,或者确切返回什么?我只想说你做得不对,所以最好显示你的输入和预期输出。基本的解决方法是
let piece\u price=wait getFinalCost(product.pieces)因为您误解了这样一个概念,即您实际上没有在“承诺”中解析值。然而,这段代码确实需要一些关于整体重构的指导。@NeilLunn,我仍然会在
{total_array:[]
中遇到同样的错误,我需要先知道如何在forEach完成后返回
总成本
,这就是为什么我要求您提供更多细节。您不需要
forEach()
在这里,您实际上可以要求数据库在没有所有请求的情况下执行此操作。这应该只需要一个异步调用。您是对的,片段是一个包含
\u id
数量的数组,当它们通过forEach时,它们在
getPrivatePrice
处执行,正如您所看到的,该函数会找到
饼图ce
材质
和计量,然后是
材质
的价格和倍数
price*meterage
,最后是该值和数量…因此,函数返回该数字,我需要所有这些数字以供以后使用,或者可能会获得有效的
createProduct
函数的最终价格,但我仍然需要获得
priceList
arrayEasy Peasy的每个项目的摘要。您在priceList数组中拥有所有需要的信息来解决这个问题。您可以在数组上运行reduce操作以获得所有项目的总和