【问题标题】:Mongoose get multiple collections and do compuitation [duplicate]猫鼬获得多个集合并进行计算[重复]
【发布时间】:2018-10-23 18:33:12
【问题描述】:

这是我的代码

module.exports.comparator = function(req, res){
    Buyer
    .find()
    .exec(function (err, buyer) {
        if (err) {
            console.log("Error finding buyer");
            res
                .status(500)
                .json(err);
        } else {
            console.log("Found buyer", buyer.length);
            res
                .json(buyer);
            buyerData = buyer;
        }
    });

    Seller
        .find()
        .exec(function (err, seller) {
            if (err) {
                console.log("Error finding seller");
                res
                    .status(500)
                    .json(err);
            } else {
                console.log("Found seller", seller.length);
                res
                    .json(seller);
                sellerData = seller;
            }
        });

})

如您所见,我正在尝试获取 2 个集合并将它们存储到一个变量中,因为我想进一步编码为...

buyerData.forEach((buyer) => {
    sellerData.forEach((seller) => {
      console.log(buyer.bidPrice , seller.askPrice)
      if(buyer.bidPrice == seller.askPrice){

但是每当我运行它时,我都会收到这样的错误

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (E:\eClass\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (E:\eClass\node_modules\express\lib\response.js:170:12)

那么我是否可以从这些不同的集合中获取数据并对它们进行其他计算?

【问题讨论】:

  • 您看到此错误是因为您已经在第一个查询中发送了响应,并且您在下一个查询中再次发送。
  • 如上所述,您不能“两次”发送响应。无论如何,您可能真的不想返回每个集合中的所有数据。数据之间可能存在“某种关系”,因此您可能想要“加入”并且可能实际上“在数据库中”进行一些“计算”,而不是将所有数据库拉入客户端。主要是你似乎不理解这两个“异步”函数在继续下一个之前不会等待对方完成。标记的重复项应该可以帮助您解决这些问题。

标签: javascript node.js express mongoose


【解决方案1】:

你可以promisifymongoose,然后完全控制你的异步操作,即:

getBuyer()
.then( buyer => getSeller(buyer) )
.then( calculateAndResponse )
.catch( handleError );

因此,您关于让卖家、买家和操纵他们的逻辑进入小方法。

如果您的环境允许,您也可以考虑使用asyncawait。那么代码库可能是这样的:

const buyer = await getBuyer();
const seller = await getSeller(buyer);
const response = await calculate(buyer, seller);
//...

这也可以在没有 promise 的情况下通过回调来完成,但它很可能会变成 回调地狱,所以在我看来,使用 promise 更好。

【讨论】:

  • Mongoose 已经支持 Promises。如果您实际使用过它并且不只是从 7 年前获得答案,您就会知道。
  • 好吧,我确实理解我可以使用承诺但参数“买家”和 calculateAndResponse 可以更具体地解释它们吗?谢谢你:)
  • @NeilLunn 抱歉,我可能错过了 mongoose 承诺成为内置的那一刻。从问题的代码示例代码库看起来有点遗留,所以我只是想让他注意他的问题更多是关于异步管理然后特定的响应错误。
  • @shashank 的想法是,getBuyer 返回由买方解决的承诺,getSeller 与卖方和买方一起解决,在calculate 中,您与他们进行必要的管理。
  • @shashank 但是如果你需要操纵一堆卖家买家,那么stackoverflow.com/questions/2350495/… - 这对你来说更可取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2021-11-06
  • 2019-05-22
  • 2015-11-03
  • 2015-09-17
  • 2022-01-21
  • 2017-04-18
相关资源
最近更新 更多