繁体   English   中英

猫鼬错误:`{“ message”:“找不到匹配的文档。”,“ name”:“ VersionError”}`

[英]Mongoose Error: `{“message”:“No matching document found.”,“name”:“VersionError”}`

我一直在尝试弄清楚为什么我的HTTP Put在使用一次后仍无法正常工作。 单击按钮时,将当前用户的ID推入数组,如下所示:

$scope.currentUser = {
  'eventsAttending' = [];
}

$scope.attending = function(event, id){

  if($cookieStore.get('token')){
    $scope.currentUser = Auth.getCurrentUser();
  }
  $scope.currentUser.eventsAttending.push(event._id);
  $http.put('/api/users/' + $scope.currentUser._id, $scope.currentUser)
    .success(function(data){
      console.log("Success. User " + $scope.currentUser.name);
    });
}

我的HTTP Put函数是这样的:

var express = require('express');
var controller = require('./user.controller');
var config = require('../../config/environment');
var auth = require('../../auth/auth.service');
router.get('/:id', controller.getEvents);

var router = express.Router();

exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  User.findById(req.params.id, function (err, user) {
    if (err) { return res.send(500, err); }
    if(!user) { return res.send(404); }
    var updated = _.merge(user, req.body);
    updated.markModified('eventsAttending');
    updated.save(function (err) {
      if (err) { return res.send(500, err); }
      return res.json(200, user);
    });
  });
};

在我的HTML页面,我有多个事件,我可以参加,而且每个事件都有按钮叫Attend ,我打电话$scope.attending和函数调用和HTTP PUT发生。 所有这些都适用于我选择参加的第一个活动。 但是,当我单击“ Attend按钮进行另一个事件时,出现错误消息:

{"message":"No matching document found.","name":"VersionError"}

而且我不知道为什么。 当我尝试在猫鼬调用中执行updated.save()并得到res.send(500, err)

我在进行谷歌搜索时尝试查看http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html来解决该问题,但我不断收到错误消息:

Undefined type at `versionKey` 
Did you try nesting Schemas? You can only nest using refs or arrays.

在添加到我的架构后:

var UserSchema = new Schema({versionKey:'myVersionKey',...

我也尝试将.save()函数更改为.update()因为有人在网上建议使用它,但这似乎给了我更多的错误。 任何想法如何解决这一问题? 那将不胜感激!

看一下下面的语法:

$scope.currentUser = {
    'eventsAttending' = [];
}

我相当确定这样的JSON结构内部的赋值会导致错误,尤其是当您尝试将该结构引入MongoDB时。

我认为您可能遇到的问题(例如,当我从类似的操作中得到此错误时)是在第一次更新后,新更新的文档上的'__v'VersionKey属性已更改,但您可能没有更新浏览器中具有的对象的属性。 因此,当您再次对其进行更新时,您将发送旧的'__v'VersionKey,(即使您更新了'eventsAttending'属性),并且该文档与较新的VersionKey相冲突。 假设Auth.getCurrentUser(); 函数从mongo返回整个文档对象。

我要做的就是简单地添加delete entity.__v; 在与请求一起发送之前,从文档中删除旧的VersionKey。 更好的是,我建议您在返回文档时更新API发送回的属性,这样一来就不会发生此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM