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然而,如果你需要操纵一群买卖双方,那么-这对你来说更可取