Javascript 猫鼬获取多个集合并进行计算

Javascript 猫鼬获取多个集合并进行计算,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,这是我的密码 module.exports.comparator = function(req, res){ Buyer .find() .exec(function (err, buyer) { if (err) { console.log("Error finding buyer"); res .status(500) .json(err);

这是我的密码

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)
那么,我是否有可能从这些不同的集合中获取数据,并对它们进行其他计算呢

您可以使用mongoose,然后完全控制您的异步操作,即:

getBuyer()
.then( buyer => getSeller(buyer) )
.then( calculateAndResponse )
.catch( handleError );
所以,你的逻辑,让卖方,买方和操纵他们变成小方法

您也可以考虑使用<代码>异步代码>代码>等待< /代码>,如果您的Env允许这样做的话。那么代码库可以是这样的:

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

这也可以在没有承诺的情况下通过回调来实现,但它很可能会变成一个回调地狱,因此从我的观点来看,使用承诺会更好。

您看到这个错误,因为您已经在第一个查询中发送了响应,并且在下一个查询中再次发送了响应。如上所述,您不能“两次”发送响应。您可能并不想返回每个集合中的所有数据。数据之间可能存在“某种关系”,因此您可能希望“连接”,并且可能实际上在“数据库”中执行一些“计算”,而不是将所有数据库拉入客户机。首先,您似乎不理解这两个“异步”函数在继续下一个之前不会等待彼此完成。标记的副本应该可以帮助您解决这些问题。猫鼬已经支持承诺了。如果你真的使用了它,而不是仅仅从7年前得到一个答案,你就会知道。我确实理解,我可以使用承诺,但参数“买方”和计算和响应可以更具体地解释它们?谢谢:)@NeilLunn对不起,我可能错过了猫鼬承诺成为一个内置软件的时刻。从question的代码示例来看,codebase看起来有点过时,所以我只是想让他注意到,他的问题更多的是异步管理,而不是特定的响应错误。@shashank的想法是,
getBuyer
返回与买方解决的承诺,
getSeller
与卖方和买方解决,在
calculate
中,你需要对他们进行必要的管理。@shashank然而,如果你需要操纵一群买卖双方,那么-这对你来说更可取