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

时间:2014-08-14 16:16:19

标签: javascript node.js angularjs mongoose mean-stack

我一直试图找出为什么我的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"}

我不知道为什么。当我尝试在mongoose调用中执行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(),因为有人在网上建议,但这似乎给了我更多错误。任何想法如何解决这一问题?非常感谢!

2 个答案:

答案 0 :(得分:0)

看看你的语法:

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

我非常确定JSON结构中的赋值会导致错误,尤其是当您尝试将该结构引入MongoDB时。

答案 1 :(得分:0)

我认为您可能遇到的问题(就像我从类似操作中收到此错误的情况一样)是在第一次更新后,' __ v'新更新的文档上的VersionKey属性已更改,但您可能无法在浏览器中的对象上更新该属性。因此,当您再次更新时,您需要发送旧的' __ v' VersionKey,(即使您更新了' eventsAttending'属性),该文档与较新的VersionKey冲突。这将假设Auth.getCurrentUser();函数从mongo返回整个文档对象。

我为解决此问题所做的只是添加delete entity.__v;以便在发送请求之前从文档中删除旧的VersionKey。更好的是,我建议您在返回文档时更新API发回的属性,这样这个问题就不会发生。