错误:在引用集合节点js时发送标题后不能设置标题

时间:2017-07-13 17:22:07

标签: node.js mongodb collections

我有两个收集分配和最终。我的代码就像这样

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。 使用上面的代码,我收到错误 - 发送后不能设置标头。 实现这个的正确方法是什么?

3 个答案:

答案 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。旨在为每件事物制作一个功能,每个功能应该只有一个目的。你还应该研究"回调地狱",它是什么以及如何避免它。