【问题标题】:Error for Cast to ObjectId failed for value "[object Object],[object Object],[object Object]值“[object Object]、[object Object]、[object Object] 转换为 ObjectId 失败”的错误
【发布时间】:2015-08-14 16:18:12
【问题描述】:

我正在使用 Mongodb。当我想更新字段时,我收到以下错误 Cast to ObjectId failed for the value:

[object Object],[object Object],[object Object].

当帖子为空时,让我更新所有属性,而有人发布一些内容,然后我无法更新提供者属性,并且出现以下错误:

从 ui bootstapt 使用 modal 的视图。

<label class="col-lg-2 control-label">Company Name</label>
        <div class="col-lg-10">
          <input name="name" type="text" ng-model="provider.name" minlength="4" class="form-control" placeholder="Amazon Web Services" required>
          <span class="help-block" ng-show="cspRegister.name.$dirty &&  cspRegister.name.$invalid"> Not valid name!</span>
        </div>
      </div>
      <div class="form-group">
        <label class="col-lg-2 control-label">Abbreviated company name</label>
        <div class="col-lg-10">
          <input name="abbreviated" type="text" ng-model="provider.abbreviated" class="form-control" placeholder="AWS" >
        </div>
      </div>
      <div class="form-group">
        <label class="col-lg-2 control-label">Home page</label>
        <div class="col-lg-10">
          <input name="url" type="url"  ng-model="provider.url" class="form-control" placeholder="http://aws.amazon.com/" required>
          <span class="help-block" ng-show="cspRegister.url.$error.url"> Not valid url!</span>
        </div>
      </div>
      <!--start point of muli select-->
      <div class="form-group">
        <label class="col-lg-2 control-label">Product name</label>
        <div class="col-lg-10">
          <select name="services"  multiple ng-model="provider.services" class="form-control" required >
            <option value="paas">Paas</option>
            <option value="saas">Saas</option>
            <option value="dbaas">Dbaas</option>
          </select>
        </div>
      </div>
      <div class="form-group">
        <label  class="col-lg-2 control-label">Location</label>
        <div class="col-lg-10">
          <select multiple  ng-model="provider.locations" class="form-control" class="form-control" required>
            <option ng-repeat="item in locations" value="{{item.name}}">{{item.name}}</option>
          </select>
          <span class="help-block">A longer block of help text that breaks onto a new line and may extend beyond one line.</span>
        </div>
      </div>
      <!--end of multi selector-->
      <div class="form-group">
        <label class="col-lg-2 control-label">Description</label>
        <div class="col-lg-10">
          <textarea name="description" ng-model="provider.description" class="form-control" rows="3" required></textarea>
        </div>
      </div>
    </form>
</div>
<div class="modal-footer">
    <button ng-click="updateProvider(provider);ok()" class="btn btn-success"><i class="icon-white icon-plus"></i> Update & Close</button>
    <button ng-click="cancel()" class="btn btn-warning">Cancel</button>
</div>

提供者架构

var ProviderSchema = new Schema({
  name: String,
  abbreviated: String,
 // company:String,
  services: {type : Array, default:[]},
  locations: {type : Array, default:[]},
  description: String,
  url: String,
  author: String,
  upvotes: { type:Number, default:0 },
  upvoteUser:{type : Array, default:[]},
  createdOn: { type: Date, default: Date.now },
  certificates:[{ type: mongoose.Schema.Types.ObjectId, ref: 'Certificates' }],
  posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }]
});

ProviderSchema.methods.findByName = function (cb) {
  return this.model('Provider').find({ name: this.name }, cb);
}
ProviderSchema.methods.upvote = function(cb) {
  this.upvotes += 1;
  this.save(cb, function(error) {
    if(error){
      console.error("Error saving object: ", error)
    }
  });
};

这是工厂更新

ob.updateProvider = function (provider) {
       return $http.put('/api/providers/' + provider._id , provider, {
            headers: {Authorization: 'Bearer '+Auth.getToken()}
            }).success(function(provider){
       })
    };

这是我的 api 中的更新功能

exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Provider.findById(req.params.id, function (err, provider) {
    if (err) { return handleError(res, err); }
    if(!provider) { return res.send(404); }

    var updated = _.merge(provider, req.body);
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, provider);
    });
  });
};

这就是我的控制器中的内容。

$scope.updateProvider = function (updatedProvider) {
                var provider = updatedProvider;
                providers.updateProvider(provider)
                  .success(function () {
                    providers.getAll();
                    $scope.status = 'Updated provider! Refreshing provider list.';
                  })
                  .error(function(err, status) {
                    console.log(err);
                    console.log(status);
                  });
              };

这是更新的结果:

 abbreviated: 'aws',
  _id: 55663fc20e9009c82dccba94,
  company: 'http://dbpedia.org/resource/SnapLogic',
  name: 'SnapLogic',
  description: 'SnapLogic is a commercial software company that provides data an
 2006. SnapLogic is headed by Ex-CEO and Co-Founder of Informatica, Gaurav Dhill
  __v: 25,
  posts:
   [ { upvotes: 4,
       upvoteUser: [Object],
       comments: [Object],
       __v: 16,
       author: 'Juan y Maryam',
       body: 'cc',
       title: 'cczzs',
       _id: '5569f716a4c7bbd4219a3303' },
     { upvotes: 4,
       upvoteUser: [Object],
       comments: [],
       __v: 4,
       author: 'Juan y Maryam',
       body: 'zzaaa',
       title: 'juan',
       _id: '5569fb10c61b1af02fa1cc39' },
     { upvotes: 4,
       upvoteUser: [Object],
       comments: [],
       __v: 4,
       author: 'Juan y Maryam',
       body: 'xxxxx',
       title: 'xxxxxxxxxx',
       _id: '5569fb15c61b1af02fa1cc3a' },
     { upvotes: 2,
       upvoteUser: [Object],
       comments: [],
       __v: 2,
       author: 'Test User',
       body: 'nnnnnnnnnnnnnnnn',
       title: 'ooooooooooooo',
       _id: '5569fcd3335d49d82ccef9cd' },
     { upvotes: 1,
       upvoteUser: [Object],
       comments: [],
       __v: 1,
       author: 'Editor',
       body: 'ss',
       title: 'sssssss',
       _id: '556a07892d62dadc182fcc1f' },
     { upvotes: 1,
       upvoteUser: [Object],
       comments: [],
       __v: 1,
       author: 'maya beaty',
       body: 'ssssssss',
       title: 'ssssssss',
       _id: '556a07f92d62dadc182fcc23' },
     { upvotes: 1,
       upvoteUser: [Object],
       comments: [],
       __v: 1,
       author: 'Maryam Pashmi',
       body: 'z',
       title: 'z',
       _id: '556a13e62848566023f03e6d' },
     556a07f92d62dadc182fcc23,
     556a13e62848566023f03e6d ],
  certificates: [],
  createdOn: Thu May 28 2015 00:05:54 GMT+0200 (Romance Daylight Time),
  upvoteUser: [ 'maya beaty', 'Maryam Pashmi', 'Juan y Maryam' ],
  upvotes: 3,
  locations: [ 'Åland Islands', 'Albania' ],
  services: [ 'saas' ] }
PUT /api/providers/55663fc20e9009c82dccba94 500 10ms

有没有人知道我为什么会收到此错误以及我必须在架构中更改什么问题?

【问题讨论】:

  • 需要查看您的架构定义,以及您为要更新到的 provider 生成新内容(字段/值)的查看代码。通常,错误意味着某个对象ID(5562ff ...)应该去的地方,它传递了一个字符串“[object Object],..”,它本身似乎是一个对象被转换为字符串。我的猜测是您打算使用该对象,但使用了它的父对象
  • @laggingreflex 感谢您的回答。我更新了我的问题。
  • 你能放一个console.log(updated) 并显示它的输出吗?在你的 api 更新函数中的 var updated = _.merge(provider, req.body) 之后
  • @laggingreflex 我用更新值更新了问题。

标签: angularjs mongoose mean-stack


【解决方案1】:

我没有解决方案,但我可以尝试解释问题所在,或者至少解释为什么它在您的情况下不起作用。虽然最后有几个解决方案可能有效也可能无效..

您的provider.posts 是由“帖子”引用的另一组文档的数组,如您的提供者架构中所定义。

posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }]
posts: [
  {upvotes: 4, ... title: 'cczzs', _id: '5569f716a4c7bbd4219a3303' }, 
  {upvotes: 4, ... title: 'juan', _id: '5569fb10c61b1af02fa1cc39' }, 
  {upvotes: 4, ... _id: '5569fb15c61b1af02fa1cc3a' }, 
  ...
  {upvotes: 1, _id: '556a13e62848566023f03e6d' }, 
  556a07f92d62dadc182fcc23, 
  556a13e62848566023f03e6d
],

这些实际上应该只保存为 ID (556a07...),因为它们是在您的 Schema 中定义的

实际上,如果你往最后看,有些元素实际上只是 ID (556a07f92d62da…),那些可能是从数据库中获取的,其他的则是来自 req.body_.merged

问题是在保存时,这些对象由于某种原因被转换为字符串“[Object object]”。这不应该发生,或者至少不会发生在我身上。我已经安装了 mongoose@3.8,所以请检查您是否使用的是旧版本。

只是为了确保这正是问题的根本原因,您应该

delete req.body.posts;
var updated = _.merge(provider, req.body);
// now updates.posts should only have 2 IDs mentioned above
updated.save(...

看看有没有保存。

无论如何,通过older questions,您会发现有些人对deleting and re-creating the entire collection 很幸运。有人建议它是bad idea to store them as objects in the first place,在这种情况下,您实际上可以.map 这些对象并在保存之前将它们转换为它们的本机字符串ID 或ObjectID。

updated.posts = updated.posts.map(function(post){return post._id});
updated.save(...

希望能以某种方式提供帮助,即使它不能解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2020-07-14
    • 2016-04-14
    • 2012-12-27
    相关资源
    最近更新 更多