Я новичок в node.js, поэтому я чувствую, что это будет что-то глупое, что я упустил, но я не смог найти ответ, который исправляет мою проблему. Я пытаюсь создать путь, который создаст новый дочерний объект, добавит его в родительский массив дочерних элементов, а затем вернет дочерний объект в запросчик. Проблема, с которой я сталкиваюсь, заключается в том, что если я передаю идентификатор строки в findById, node сработает с
TypeError: Object {} не имеет метода 'cast'
Если я попытаюсь передать ObjectId вместо этого, я получаю
CastError: Cast to 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:[email protected]: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", это будет выход кода:
error: CastError: Cast to ObjectId не удалось присвоить значение "[Object Object]" по пути "_id" { "Путь": "51c35e5ced18cb901d000001", "экземпляр": "ObjectID", "валидаторы": [], "сеттеры": [], "геттеры": [], "_ Индекс": NULL}
Я попытался использовать findOne и перешел в {_id: id}, но это похоже на то, что делает findById. Я пробовал разные классы для ObjectId, которые я видел на других сайтах. Я попытался вызвать ObjectId() как функцию вместо конструктора и возвращает undefined. На данный момент у меня заканчиваются идеи, и не кажется, что поиск в поисковых системах помогает. Любые идеи о том, что я делаю неправильно?
Кроме того, как я уже сказал, я новичок в node/Mongo/Mongoose/Express, поэтому, если есть лучший способ выполнить мою цель, пожалуйста, дайте мне знать. Я ценю всю обратную связь.
EDIT:
После обходного пути от Питера Лиона я искал еще одну ошибку, с которой я столкнулся, и нашел findByIdAndUpdate, которая работает так, как ожидалось, и делает именно то, что я надеялся сделать. Я все еще не уверен, почему findById и findOne дают мне такие проблемы, и мне любопытно узнать (возможно, отчет об ошибке должен быть подан), поэтому я оставлю это открытым, если у кого-то есть ответ.