Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在api调用中更新2个mongoose模式_Node.js_Mongodb_Mongoose_Mean Stack - Fatal编程技术网

Node.js 在api调用中更新2个mongoose模式

Node.js 在api调用中更新2个mongoose模式,node.js,mongodb,mongoose,mean-stack,Node.js,Mongodb,Mongoose,Mean Stack,目前,我正试图在一个api调用中更新两个不同的用户模式 第一个模式记录在用户模式中,我们给它一个名称=Tom 第二个模式是注册应用程序的其他用户,我们给它命名为=John 模式代码 schema.js var mongoose = require('mongoose'); var Schema = mongoose.Schema; var bcrypt = require('bcrypt-nodejs'); var UserSchema = new Schema({ name: S

目前,我正试图在一个api调用中更新两个不同的用户模式

第一个模式记录在用户模式中,我们给它一个名称=Tom 第二个模式是注册应用程序的其他用户,我们给它命名为=John

模式代码

schema.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs');



var UserSchema = new Schema({
    name: String,
    username: { type: String, required: true, index: { unique: true }},
    password: { type: String, required: true, select: false },
    followers: [{ type: Schema.Types.ObjectId, ref: 'User'}],
    following: [{ type: Schema.Types.ObjectId, ref: 'User'}],
    followersCount: Number,
    followingCount: Number

});


module.exports = mongoose.model('User', UserSchema);
api名称是“/follow/:user_id”,我想要实现的是。每当用户Tom跟随其他用户(如John)时,Tom的following字段以及John的follower字段都将更新

我当前的尝试(req.decoded.id是登录用户)

api.js

// The first way

apiRouter.post('/follow/:user_id', function(req, res) {
    User.findOneAndUpdate(
    {   

        _id: req.decoded.id, 
        following: { $ne: req.params.user_id }
    }, 

    { 
        $push: { following: req.params.user_id},
        $inc: { followingCount: 1}

    },
    function(err, currentUser) {
        if (err) {
            res.send(err);
            return;
        }
        console.log(currentUser);

    });
    User.findOneAndUpdate(
    {

        _id: req.params.user_id,
        followers: { $ne: req.decoded.id } 

    },

    {
        $push: { followers: req.decoded.id },
        $inc: { followersCount: 1}

    }, function(err, user) {
        if(err) {
            res.send(err);
            return;
        }
        res.json({
            message: "Successfully followed"
        });
    }
    )
});


//Second way

apiRouter.post('/follow/:user_id', function(req, res) {

    // find a current user that has logged in
        User.update(
            {   
                _id: req.decoded.id, 
                following: { $ne: req.params.user_id } 
            }, 

            { 
                $push: { following: req.params.user_id},
                $inc: { followingCount: 1}

            },
            function(err) {
                if (err) {
                    res.send(err);
                    return;
                }

                User.update(
                    {
                        _id: req.params.user_id,
                        followers: { $ne: req.decoded.id }
                    },

                    {   
                        $push: { followers: req.decoded.id },
                        $inc: { followersCount: 1}

                    }

                ), function(err) {
                    if(err) return res.send(err);

                    res.json({ message: "Successfully Followed!" });
                }

        });
});
都有问题,


第一种方法:问题是,“不能设置已经发送的头”,因为在一个api调用中有两个单独的mongoose查询,所以它会响应两次,这就是为什么我会出现这个错误

第二种方法:问题是,登录用户(Tom)的following字段得到更新,而另一个用户的followers字段(John)返回null。我将记录这两个值,并使用POSTMAN chrome应用程序对其进行测试


伙计们,把你们的想法借给我

第一种方法可以从两个方面进行改进。一个是在更新后续字段的回调中更新followers字段。另一种方法是使用异步瀑布。我建议使用异步瀑布(npm async瀑布)。

第二种方法是正确的(可以改进并行运行这两种方法),我想问题出在另一个地方。我不知道您正在使用哪个框架,但我猜字段
\u id
来自mongoDB,是一个
ObjectId
,看起来decoded.id可以是ObjectId,而来自请求的id当然只是一个字符串。所以我猜它是空的,因为它找不到任何具有该字符串的用户


尝试将其设置为该字符串中的objectId(在第二个查询中参考
req.params.user_id

您选择的第一条路线似乎没有问题

但是,正如@cdbajorin所提到的,错误“无法发送已经发送的头”与mongoose无关,而是您在向客户端发送响应后试图设置头。()

我的建议是,在发送响应之前,确保两个数据库调用都成功


在这种情况下,您可能还需要研究一个数据库,因为MongoDB不支持传统的DB事务,并且您正在更新两个文档,一次更新一个。如果由于某种原因,数据库调用失败,则应执行恢复到稳定状态的过程。

您所说的“其他用户的追随者字段(John)返回null”是什么意思?“无法设置已发送的标头”与mongoose或您的查询无关。它与多次调用
res.send()
res.json()
有关。在第一个示例中,唯一可能发生的方法是如果top
findOneAndUpdate
出现错误。你能给我举个例子,让我接受你的答案并给你奖金吗-