Lors de l'envoi d'une demande à /customers/41224d776a326fb40f000001
et un document avec _id
41224d776a326fb40f000001
n'existe pas, doc
est null
et je retourne 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);
});
};
Cependant, quand _id
ne correspond pas à ce que Mongoose attend comme "format" (je suppose) par exemple avec GET /customers/foo
une erreur étrange est retourné:
CastError: échec de la conversion en ObjectId pour la valeur "foo" au chemin "_id".
Alors, quelle est cette erreur?
_id
dans votre schéma Mongoose. Dans le"bla"
cas où vous utiliseriez un type deString
au lieu de la valeur par défautObjectId
et vous n'auriez pas besoin d'ajouter cette vérification car tout peut être converti en chaîne.ObjectId
partir d'une chaîne donnée (à partir de laGET
requête) pour le transmettre à lafindById
méthode?ObjectId("000000000000") --> 303030303030303030303030
Utilisez les fonctions existantes pour vérifier ObjectID.
la source
'your id here'
exemple. github.com/mongodb/js-bson/issues/106Analysez-vous cette chaîne comme
ObjectId
?Ici, dans mon application, ce que je fais est:
la source
mongoose.Types.ObjectId
.fromString
n'est pas une fonctionJ'ai le même problème que j'ajoute
_id: String .in schema puis il commence à fonctionner
la source
J'ai dû déplacer mes itinéraires par-dessus d'autres itinéraires qui captent les paramètres de l'itinéraire:
la source
le mieux est de vérifier la validité
la source
Dans mon cas, j'ai dû ajouter
_id: Object
dans mon schéma, puis tout a bien fonctionné.la source
Vous pouvez également utiliser ObjectId.isValid comme suit:
la source
la source
J'ai été confronté à quelque chose de similaire récemment et je l'ai résolu en détectant l'erreur pour savoir s'il s'agissait d'une erreur Mongoose ObjectId.
la source
Au 19 novembre 2019
Vous pouvez utiliser à
isValidObjectId(id)
partir de la version 5.7.12 de la mangoustehttps://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-isValidObjectId
la source
J'ai opté pour une adaptation de la solution @gustavohenke, implémentant le cast ObjectId dans un try-catch enroulé autour du code d'origine pour tirer parti de l'échec du casting ObjectId comme méthode de validation.
la source
C'est une vieille question mais vous pouvez également utiliser le package express-validator pour vérifier les paramètres de la demande
express-validator version 4 (dernière):
express-validator version 3:
la source
Utilisez toujours
mongoose.Types.ObjectId('your id')
des conditions dans votre requête, il validera le champ id avant d'exécuter votre requête, par conséquent, votre application ne plantera pas.la source
OU vous pouvez le faire
var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
comme mentionné ici, la méthode de recherche de Mongoose avec $ ou condition ne fonctionne pas correctement
la source
La façon dont je résout ce problème transforme l'identifiant en une chaîne
je l'aime bien avec le backtick:
`${id}`
cela devrait résoudre le problème sans frais généraux
la source
ObjectId est composé des éléments suivants.
La méthode correcte pour valider si objectId est valide consiste à utiliser la méthode statique de la classe ObjectId elle-même.
mongoose.Types.ObjectId.isValid (sample_object_id)
la source
Convertir la chaîne en ObjectId
la source
Détection et correction de l'erreur ObjectID
Je suis tombé sur ce problème en essayant de supprimer un élément à l'aide de la mangouste et j'ai eu la même erreur. Après avoir examiné la chaîne de retour, j'ai trouvé qu'il y avait des espaces supplémentaires à l'intérieur de la chaîne retournée qui ont causé l'erreur pour moi. J'ai donc appliqué quelques-unes des réponses fournies ici pour détecter l'ID erroné, puis supprimer les espaces supplémentaires de la chaîne. Voici le code qui a fonctionné pour moi pour enfin résoudre le problème.
Cela a fonctionné pour moi et je suppose que si d'autres éléments commencent à apparaître dans la chaîne de retour, ils peuvent être supprimés de la même manière.
J'espère que ça aide.
la source
J'ai corrigé ce problème en modifiant l'ordre des itinéraires.
la source
J'avais des problèmes avec cela et j'ai résolu de m'en
mongoose.ObjectId(id)
passerTypes
la source