Al enviar una solicitud a /customers/41224d776a326fb40f000001
y un documento con _id
41224d776a326fb40f000001
no existe, doc
es null
y estoy devolviendo un 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);
});
};
Sin embargo, cuando _id
no coincide con lo que Mongoose espera como "formato" (supongo), por ejemplo, GET /customers/foo
se devuelve un error extraño:
CastError: Error de conversión a ObjectId para el valor "foo" en la ruta "_id".
Entonces, ¿qué es este error?
_id
en su esquema de Mongoose. En el"bla"
caso de que use un tipo de enString
lugar del predeterminadoObjectId
y no necesitaría agregar esta verificación, ya que cualquier cosa se puede convertir en una cadena.ObjectId
partir de una cadena determinada (de laGET
solicitud) para pasarla alfindById
método?ObjectId("000000000000") --> 303030303030303030303030
Utilice funciones existentes para comprobar ObjectID.
fuente
'your id here'
ejemplo. github.com/mongodb/js-bson/issues/106¿Estás analizando esa cadena como
ObjectId
?Aquí en mi aplicación, lo que hago es:
fuente
mongoose.Types.ObjectId
.fromString
no es una funciónTengo el mismo problema, agrego
_id: String .in esquema y luego comienza a funcionar
fuente
Tuve que mover mis rutas por encima de otras rutas que están capturando los parámetros de la ruta:
fuente
lo mejor es verificar la validez
fuente
En mi caso, tuve que agregar
_id: Object
a mi esquema, y luego todo funcionó bien.fuente
También puede usar ObjectId.isValid como el siguiente:
fuente
fuente
Me enfrenté a algo similar recientemente y lo resolví detectando el error para averiguar si se trataba de un error de Mongoose ObjectId.
fuente
A partir del 19 de noviembre de 2019
Puedes usar
isValidObjectId(id)
desde la versión 5.7.12 de mangostahttps://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-isValidObjectId
fuente
Fui con una adaptación de la solución @gustavohenke, implementando cast ObjectId en un try-catch envuelto alrededor del código original para aprovechar el error de conversión de ObjectId como método de validación.
fuente
Esta es una pregunta antigua, pero también puede usar el paquete express-validator para verificar los parámetros de solicitud
express-validator versión 4 (más reciente):
express-validator versión 3:
fuente
Utilice siempre
mongoose.Types.ObjectId('your id')
para las condiciones en su consulta, validará el campo de identificación antes de ejecutar su consulta, como resultado, su aplicación no se bloqueará.fuente
O puedes hacer esto
var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
como se menciona aquí, el método de búsqueda de Mongoose con $ o condición no funciona correctamente
fuente
La forma en que soluciono este problema es transformando la identificación en una cadena
me gusta elegante con comillas invertidas:
`${id}`
esto debería solucionar el problema sin gastos generales
fuente
ObjectId se compone de las siguientes cosas.
La forma correcta de validar si el objectId es válido es mediante el uso del método estático de la propia clase ObjectId.
mongoose.Types.ObjectId.isValid (sample_object_id)
fuente
Convertir cadena en ObjectId
fuente
Detección y corrección del error ObjectID
Me encontré con este problema al intentar eliminar un elemento con mangosta y obtuve el mismo error. Después de mirar la cadena de retorno, encontré que había algunos espacios adicionales dentro de la cadena devuelta que me causaron el error. Entonces, apliqué algunas de las respuestas proporcionadas aquí para detectar la identificación errónea y luego eliminé los espacios adicionales de la cadena. Aquí está el código que me funcionó para finalmente resolver el problema.
Esto funcionó para mí y supongo que si otros elementos comienzan a aparecer en la cadena de devolución, se pueden eliminar de manera similar.
Espero que esto ayude.
fuente
Solucioné este problema cambiando el orden de las rutas.
fuente
Estaba teniendo problemas con esto y lo arreglé
mongoose.ObjectId(id)
sinTypes
fuente