【问题标题】:Update Issues with Put Request, JQuery, MongoDB and MongoosePut Request、JQuery、MongoDB 和 Mongoose 的更新问题
【发布时间】:2015-05-21 17:08:21
【问题描述】:

我正在尝试使用 MongoDB、Mongoose、JQuery 和 Node.js 构建应用程序。每当我尝试添加到架构中的数组时,有时它会多次添加该项目。

架构

这是我的架构,我正在尝试添加我的 upvote 和 downvote 数组,以跟踪通过他们的 id 投票的用户。

var SuggestionSchema = new mongoose.Schema({ 标题:字符串, 内容:字符串, 链接:字符串, 赞成票:[{ 用户身份: { 类型:Schema.ObjectId, 参考:'用户' } }], 否决票:[{ 用户身份: { 类型:Schema.ObjectId, 参考:'用户' } }], 用户身份: { 类型:Schema.ObjectId, 参考:'用户' }, 类别ID:{ 类型:Schema.ObjectId, 参考:'类别' }, });

路由查询

这是我的放置路线和查询

router.put('/:suggestion_id/downvote', function(req, res, next) { Suggestion.findByIdAndUpdate( req.params.suggestion_id, {$push: {"downvote": req.body}}, 功能(错误,建议){ res.json(建议); }) });

使用 Jquery 进行 Ajax 调用

这是我在点击时触发的 PUT 请求。

$('#downvote').click(function(){ 变种用户 = { user_id: current_user._id } $.ajax({ url: current_url + "suggestions/" + current_suggestion + '/downvote', 类型:'PUT', 数据:用户, 成功:函数(数据){ //打回来 } }); }

结果

另外两点需要注意:

控制台将返回:

加载资源失败:net::ERR_EMPTY_RESPONSE

最终仅单击一次有时会导致 2 或 3 个同一用户被推入 Schema 中的 downvote 数组。我在前端设置了一些保护措施来检查用户是否已经投票,但它似乎仍然通过多次,所以我认为这是一个不同的问题。我相信我只是错误地接近它或错过了一些基本的东西。我只写了 6 个月的代码,所以我还在学习。谢谢!

【问题讨论】:

  • 当这种情况发生时,您是否看到针对服务器的多个请求?

标签: javascript jquery node.js mongodb mongoose


【解决方案1】:

不要使用$push 运算符将用户ID 对象推送到downvote 数组,而是使用$addToSet 运算符。这会向数组添加一个值,除非该值已经存在,在这种情况下,$addToSet 对该数组没有任何作用。它只确保没有重复的项目添加到集合中,并且不会影响现有的重复元素。如果要更新的文档中不存在该字段,$addToSet 将创建具有指定值作为其元素的数组字段。所以你的最终路线看起来像:

router.put('/:suggestion_id/downvote', function(req, res, next) {
    Suggestion.findByIdAndUpdate(
        req.params.suggestion_id,
        {$addToSet: {"downvote": req.body}},
        function(err, suggestion) {
            res.json(suggestion);
        }
    );
});

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2018-04-16
    • 2011-10-09
    • 1970-01-01
    • 2022-07-12
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多