При отправке запроса в адрес /customers/41224d776a326fb40f000001
и документ с _id
41224d776a326fb40f000001
не существует, doc
есть, null
и я возвращаю 404
:
Controller.prototype.show = function(id, res) {
this.model.findById(id, function(err, doc) {
if (err) {
throw err;
}
if (!doc) {
res.send(404);
}
return res.send(doc);
});
};
Однако, когда _id
не совпадает с тем, что ожидает Mongoose, как "формат" (я полагаю), например, GET /customers/foo
возвращается странная ошибка:
CastError: сбой преобразования в ObjectId для значения «foo» в пути «_id».
Так что это за ошибка?
_id
в своей схеме Mongoose. В"bla"
случае, если вы использовали бы типString
вместо значения по умолчанию,ObjectId
и вам не нужно было бы добавлять эту проверку, так как что угодно может быть преобразовано в строку.ObjectId
из заданной строки (изGET
запроса) для передачи ееfindById
методу?ObjectId("000000000000") --> 303030303030303030303030
Используйте существующие функции для проверки ObjectID.
источник
'your id here'
примера. github.com/mongodb/js-bson/issues/106Вы разбираете эту строку как
ObjectId
?В моем приложении я делаю следующее:
источник
mongoose.Types.ObjectId
.fromString
не функцияУ меня такая же проблема, как я добавляю
_id: String. В схеме, затем она начинает работать
источник
Мне пришлось переместить свои маршруты поверх других маршрутов, улавливающих параметры маршрута:
источник
лучше всего проверить действительность
источник
В моем случае мне пришлось добавить
_id: Object
в свою схему, и тогда все заработало.источник
Вы также можете использовать ObjectId.isValid следующим образом:
источник
источник
Недавно я столкнулся с чем-то похожим и решил это, перехватив ошибку, чтобы узнать, является ли это ошибкой Mongoose ObjectId.
источник
По состоянию на 19 ноября 2019 г.
Ты можешь использовать
isValidObjectId(id)
мангуст версии 5.7.12https://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-isValidObjectId
источник
Я пошел с адаптацией решения @gustavohenke, реализовав приведение ObjectId в try-catch, обернутом вокруг исходного кода, чтобы использовать сбой приведения ObjectId в качестве метода проверки.
источник
Это старый вопрос, но вы также можете использовать пакет экспресс-валидатора для проверки параметров запроса.
экспресс-валидатор версии 4 (последняя):
экспресс-валидатор версии 3:
источник
Всегда используйте
mongoose.Types.ObjectId('your id')
для условий в вашем запросе, он будет проверять поле id перед запуском вашего запроса, в результате ваше приложение не выйдет из строя.источник
ИЛИ вы можете сделать это
var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
как упоминалось здесь , метод поиска Mongoose с условием $ или не работает должным образом
источник
Способ, которым я исправляю эту проблему, - это преобразование идентификатора в строку
мне нравится фантазия с обратной кавычкой:
`${id}`
это должно решить проблему без накладных расходов
источник
ObjectId состоит из следующих вещей.
Правильный способ проверить, действителен ли objectId, - использовать статический метод из самого класса ObjectId.
mongoose.Types.ObjectId.isValid (sample_object_id)
источник
Привести строку к ObjectId
источник
Обнаружение и исправление ошибки ObjectID
Я столкнулся с этой проблемой при попытке удалить элемент с помощью мангуста и получил ту же ошибку. После просмотра возвращаемой строки я обнаружил, что внутри возвращаемой строки есть лишние пробелы, которые вызвали у меня ошибку. Итак, я применил несколько представленных здесь ответов, чтобы обнаружить ошибочный идентификатор, а затем удалить лишние пробелы из строки. Вот код, который помог мне окончательно решить проблему.
Это сработало для меня, и я предполагаю, что если в возвращаемой строке начнут появляться другие элементы, их можно будет удалить аналогичным образом.
Надеюсь, это поможет.
источник
Я исправил эту проблему, изменив порядок маршрутов.
источник
У меня были проблемы с этим, и я исправил работу
mongoose.ObjectId(id)
безTypes
источник