我有两个收集分配和最终。我的代码就像这样
app.post('/checkuser',function(req,res){
//var id="ObjectId('"+req.body.id+"')";
var mongo=require('mongodb');
var ObjectID=require('mongodb').ObjectID;
var obj_id=new ObjectID(req.body.id);
//var username=req.body.username;
mongoClient.connect(url,function(err,db){
db.collection('assign',function(err,collection){
collection.findOne({"_id":obj_id},function(err,result){
res.send(result);
db.final.findOne({"username":result.user.username},function(err,results){
res.send(results);
})
})
})
})
})
assign系列中的数据采用此格式
{
"_id" : ObjectId("59674fb5a13752326c939dcd"),
"user" : {
"username" : "c",
"password" : "v"
}
}
最终集合中的数据就像这样
{
"_id" : ObjectId("59674cfc081305f9c8b5bc58"),
"username" : "c",
"name" : "MAC",
"asset" : "PRO",
"place" : "Bangalore"
}
我想访问用户名的数据:" c"通过在assign集合中提供id。 使用上面的代码,我收到错误 - 发送后不能设置标头。 实现这个的正确方法是什么?
答案 0 :(得分:0)
您为同一res.send()
多次致电res
。您只能为单个HTTP请求发送一次响应。
如果您想回复多条信息,则需要先将它们以某种方式合并,然后再将其传递给res.send()
。
答案 1 :(得分:0)
我发现错误基本上意味着数据已经发送,然后标题被操纵。另外,res对象不能在同一个函数中被多次调用。因此,第二个查询应该在第一个函数的成功函数中执行。
答案 2 :(得分:0)
这是一个可能的解决方案:
mongoClient.connect(url,function(err,db){
db.collection('assign',function(err,collection){
collection.findOne({"_id":obj_id},function(err,result){
db.final.findOne({"username":result.user.username},function(err, result, results){
res.send({ "first": result, "second": results });
})
})
})
})
抱歉,我无法验证,但它的目标是将第一个结果传递给下一个函数,然后发送一个包含两个结果的对象。如果它有效,它至少应该让你再次移动。
你陷入了混乱的境地,因为你的巢很深。我建议学习和练习Promises和async / await。旨在为每件事物制作一个功能,每个功能应该只有一个目的。你还应该研究"回调地狱",它是什么以及如何避免它。