Я новичок в node.js, поэтому у меня есть ощущение, что это будет что-то глупое, что я упустил из виду, но я не смог найти ответ, который решает мою проблему. Я пытаюсь создать путь, который создаст новый дочерний объект, добавит его в родительский массив дочерних элементов, а затем вернет дочерний объект запрашивающей стороне. Проблема, с которой я сталкиваюсь, заключается в том, что если я передаю идентификатор строки в findById, узел выйдет из строя с
TypeError: объект {} не имеет метода cast
Если вместо этого я попытаюсь передать ObjectId, я получу
CastError: сбой при преобразовании в ObjectId для значения «[object Object]» по пути «_id»
Вот приблизительный набросок моего кода:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
Если я выполню этот код с путем "/ myClass / 51c35e5ced18cb901d000001 / childClass / create", это будет вывод кода:
ошибка: CastError: сбой преобразования в ObjectId для значения «[object Object]» по пути «_id» {«path»: «51c35e5ced18cb901d000001», «instance»: «ObjectID», «validators»: [], «setters»: [ ], "геттеры": [], "_ index": null}
Я пробовал использовать findOne и вместо этого передавал {_id: id}, но похоже, что это именно то, что делает findById. Я пробовал разные классы для ObjectId, которые я видел на других сайтах. Я пробовал вызывать ObjectId () как функцию вместо конструктора, и она возвращает undefined. На данный момент у меня заканчиваются идеи, и поиск ответа в Google не помогает. Есть идеи о том, что я делаю неправильно?
Кроме того, как я уже сказал, я новичок в node / Mongo / Mongoose / Express, поэтому, если есть лучший способ достичь моей цели, сообщите мне. Я ценю все отзывы.
РЕДАКТИРОВАТЬ:
После обходного пути от Питера Лайонса я погуглил еще одну ошибку, с которой я столкнулся, и нашел findByIdAndUpdate, который работает, как ожидалось, и делает именно то, что я надеялся сделать. Я до сих пор не уверен, почему findById и findOne вызывают у меня такие проблемы, и мне любопытно узнать (возможно, необходимо отправить отчет об ошибке), поэтому я оставлю это открытым на случай, если у кого-то еще есть ответ.
findOne
с однимObjectId
, ноfindOne
ожидает обычный объект JS с условиями ключа / значения. - person Peter Lyons   schedule 13.08.2013