186 votes

Quelle est l'erreur Mongoose Cast to ObjectId failed for value XXX at path "_id" ?

Lorsque vous envoyez une demande à /customers/41224d776a326fb40f000001 et un document avec _id 41224d776a326fb40f000001 n'existe pas, doc es null et je renvoie 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, lorsque _id ne correspond pas à ce que Mongoose attend comme "format" (je suppose) par exemple avec GET /customers/foo une erreur étrange est renvoyée :

CastError : Cast to ObjectId failed for value "foo" at path "_id".

Alors, c'est quoi cette erreur ?

240voto

JohnnyHK Points 61191

Mongoose findById transforme la méthode id en fonction du type de l'élément _id afin de pouvoir rechercher correctement le document correspondant. Il s'agit d'un ObjectId mais "foo" n'est pas un ObjectId valide, donc le cast échoue.

Cela ne se produit pas avec 41224d776a326fb40f000001 car cette chaîne est un ObjectId valide.

Une manière de résoudre ce problème est d'ajouter un contrôle avant votre findById appeler pour voir si id est un ObjectId valide ou non comme ceci :

if (id.match(/^[0-9a-fA-F]{24}$/)) {
  // Yes, it's a valid ObjectId, proceed with `findById` call.
}

69voto

xpepermint Points 5543

Utiliser les fonctions existantes pour vérifier ObjectID.

var mongoose = require('mongoose');
mongoose.Types.ObjectId.isValid('your id here');

25voto

Ryan Dhungel Points 75

J'ai dû déplacer mes routes au-dessus d'autres routes qui capturent les paramètres de la route :

// require express and express router

const express = require("express");
const router = express.Router();

// move this `/post/like` route on top

router.put("/post/like", requireSignin, like);

// keep the route with route parameter `/:postId` below regular routes

router.get("/post/:postId", singlePost);

18voto

s.babar Points 65

J'ai le même problème, j'ajoute
_id : String .in schema then it start work

15voto

Harsh Verma Points 153

Il peut s'agir d'une erreur de route si vous avez deux routes différentes, comme ceci

router.route("/order/me") //should come before the route which has been passed with params
router.route("/order/:id")

il faut alors faire attention à mettre la route qui utilise un paramètre après la route normale ; cela a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X