2015-06-01 22 views
0

Я использую Mongodb. Когда я хочу обновлять поля, я получаю следующую ошибку: Cast to ObjectId не удалось получить значение:Ошибка для Cast to ObjectId с ошибкой для значения «[object Object], [object Object], [object Object]

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

Когда пост пуст, позвольте мне, чтобы обновить все свойства в то время как кто-то разместить нечто, то я не могу обновить свойства поставщика, и я получаю следующее сообщение об ошибке:.

View, которые использовали модальные от ui bootstapt.

<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){ 
     }) 
    }; 

и это функция обновления в моем апи

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 

Есть ли один, кто знает, почему я получаю эту ошибку, и что проблема, которую я должен изменить в моей схеме?

+0

Необходимо увидеть определение схемы и код представления, в котором вы обновляете новый контент (поля/значение) для «поставщика». Как правило, ошибка означает, что где-то там, где должен был идти объектID (5562ff ...), он передает строку «[object Object], ..», которая сама по себе кажется объектом, преобразованным в строку. Я предполагаю, что вы хотели использовать этот объект, но вместо этого использовали свой родительский объект – laggingreflex

+0

@laggingreflex, оцененный для вашего ответа. Я обновил свой вопрос. –

+0

Не могли бы вы добавить 'console.log (обновленный)' и показать его вывод? прямо после 'var updated = _.merge (поставщик, req.body)' в вашей функции обновления в вашем api – laggingreflex

ответ

2

У меня нет решения, но я могу попытаться объяснить, в чем проблема, или, по крайней мере, почему он не работает в вашем случае. Хотя в конце есть несколько решений, которые могут или не могут работать.

Ваш 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 
], 

Это на самом деле должны быть сохранены как только идентификаторы (556a07 ...), потому что это, как они определены в вашей схеме

На самом деле, если вы посмотрите в конце есть некоторые элементы, которые на самом деле являются только идентификаторами (556a07f92d62da ...), те, которые, вероятно, выбраны из базы данных, а остальные - _.merge d от req.body

Проблема в том, что при сохранении эти объекты по какой-либо причине преобразуются в строку «[Объект объекта]». Это не должно произойти или, по крайней мере, со мной не происходит. У меня установлен [email protected], поэтому проверьте, может быть, вы на старой версии.

Просто, чтобы убедиться, что это именно основной причиной этой проблемы, вы должны

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 этих объектов и преобразовать их в свой собственный идентификатор строки или ObjectID перед сохранением.

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

Надеюсь, что это поможет в некотором роде, даже если оно не решит проблему.

Смежные вопросы