mongoose/mongodb 不会用 PUT 更新

Posted

技术标签:

【中文标题】mongoose/mongodb 不会用 PUT 更新【英文标题】:mongoose/mongodb won't update with PUT 【发布时间】:2016-02-24 20:26:28 【问题描述】:

我目前是表达和失败方式的学生。

我目前的头疼是 PUT 不是 PUT-ting。我的应用程序有大量数据,我需要在用户第一次登录时上传。我认为之后会更快,因为我只能上传已更改的内容。这个理论不太行得通。

步骤如下:

    用户第一次登录,通过验证 应用在 Values 架构中创建一个新条目,其中仅包含必填字段 应用翻转用户架构中的开关以显示创建的值 然后应用将其余值放入该现有架构中。

我把 2 和 4 分成两部分,因为当我把它分成一个时,出于某种原因,Mongoose 开始发出嘶嘶声。除了现在,它实际上并没有在第 4 步放置任何东西,甚至在用户编辑它之后(通过应用程序中的表单)。就好像它停止听了一样。

这就是 values 架构的样子(因为它太大而被截断):

    var ValueSchema = new Schema(
        user_id: 
            type: String,
            required: true,
            unique: true
        ,
        base: [
            type: String,
            required: true
        ],
        value1: [ String ],
        value2: [ String ],
        value3: [ String ],
        value4: [ String ]
    );

这是 GETting 和 PUTting 部分:

    // ------------------ FORM VALUES
    router.route('/values/:user_id')
        // create
        .post(function(req, res) 
            var task = req.body;
            var value = new Value(task);
            value.save(function(err) 
                if (err) 
                    res.json(err);
                 else 
                    res.write("success");
                
            );
        )
        // update
        .put(function(req, res) 
            var values = req.body;
            var user_id = req.params.user_id;
            Value.update(user_id: user_id, function(err, values) 
                if (!err) 
                    res.json("okay");
                 else 
                    res.write("fail");
                
            );
        )
        // view
        .get(function(req, res) 
            var id = req.params.user_id;
            Value.find('user_id':id, function(err, value) 
                if (!err) 
                    res.send(value);
                 else 
                    res.write("fail");
                
            );
        )
    );

由于我仍然无法弄清楚的原因,第 2 步需要永远。最重要的是,Firefox 发送没有令牌的消息,但 http 调用在“网络”选项卡和服务器本身的输出中都显示为成功。这是其中一个 http 调用:

        return $http(
            method: 'PUT',
            url: '/api/values/' + userId,
            data: values,
            headers: 
                'x-access-token':  token
            
        )
        .then(function (response) 
            // chained to next step
            // etc

对我来说看起来很教科书,但是当我在任何 PUT 后签入 Postman 时,值条目看起来像这样:

    [
        
            "_id": "56513f140dab13e932682cf2",
            "user_id": "5651f7454cd0c2543ca5202f",
            "__v": 0,
            "value1": [],
            "value2": [],
            "value3": [],
            "value4": []
        
    ]

在第一次 POST 之后,它根本没有更新。疯狂的是,我可以更新其他两个模式并且一切正常,并且这些模式与 Value 模式具有相同的模式。帮助!我错过了什么?

提前致谢!

【问题讨论】:

【参考方案1】:

您的 update() 方法缺少更新文档:

// update
.put(function(req, res) 
    var values = req.body;
    var user_id = req.params.user_id;
    Value.update(user_id: user_id, values, function(err, values) 
        if (!err) 
            res.json("okay");
         else 
            res.write("fail");
        
    );
)

【讨论】:

我有 "$set": values 在那里,但把它拿出来 b/c 我得到了各种关于它找不到 user_id 的错误。因此,如果我只输入“值”,那只是添加它,但如果我使用 $set,那就是正在搜索的内容? 如果你仔细阅读docsupdate() 方法有不同的签名和可选参数,但是通过上面的更新,如果查询匹配,默认操作类似于$set 运算符更新任何文件。 赞美和奉承的圣魔堆,它有效。仍然不知道为什么第一个 POST 需要这么长时间,但至少现在 PUT 正在运行。谢谢!! 我知道这篇文章发布已经一年多了,但仍然如此。谢谢你。这以你无法想象的方式帮助了我。你的回答更容易理解和直接——比我找到的关于 put requests 的教程更容易! @DeeJ。不用担心。很高兴我能帮上忙。

以上是关于mongoose/mongodb 不会用 PUT 更新的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose / MongoDB _id 作为字符串

将新评论推送到 mongoose/mongodb/angularjs 中的评论数组中

Mongoose / Mongodb 迁移到 MySQL

mongoose \ mongodb 按一些列表排序? [复制]

无法与 Mongoose (Mongodb) 连接

Mongoose/MongoDb 收到错误 geoNear 不是函数