首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在api调用中更新2个猫鼬模式

在api调用中更新2个猫鼬模式
EN

Stack Overflow用户
提问于 2015-02-12 10:06:01
回答 3查看 1.2K关注 0票数 9

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

第一个模式登录到用户模式中,我们给它一个名称= Tom,第二个模式是注册该应用程序的其他用户,我们给它一个名字= John

模式代码

schema.js

代码语言:javascript
复制
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名称是‘/追随者/:user_id’,我想要实现的是。每当用户Tom跟随其他用户的(如John )时,Tom的字段以及John的追随者字段都会被更新。

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

api.js

代码语言:javascript
复制
// 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调用中有两个单独的猫鼬查询,它会响应两次--这就是我得到错误的原因。

第二种方法:问题是,登录用户(Tom)的跟随字段得到更新,而其他用户的追随者字段(John)返回null。我控制台记录这两个值,以及测试它的邮递员铬应用。

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

EN

回答 3

Stack Overflow用户

发布于 2015-09-11 03:22:05

你走的第一条路似乎没问题。

但是,正如@cdbajorin所提到的,错误“不能发送已经发送的标题”与mongoose无关,而是在向客户端发送响应后尝试设置标头。(看这个可爱的答案)

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

在这种情况下,您还可能需要查看一个两相提交,因为MongoDB不支持传统的DB事务,您正在更新两个文档,每次一个文档。如果由于某种原因,任何数据库调用都失败,则应采取恢复到稳定状态的过程。

票数 1
EN

Stack Overflow用户

发布于 2015-09-05 17:05:54

第一种方法可以通过两种方式加以改进。一种是在更新后续字段的回调中更新追随者字段。另一种方法是使用异步瀑布。我建议采用异步瀑布(npm异步瀑布).

票数 0
EN

Stack Overflow用户

发布于 2015-09-08 12:04:05

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

尝试将其从该字符串中转换为objectId (在第二个查询中对req.params.user_id进行回复)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28474558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档