1. ホーム
  2. mongodb

[解決済み] Mongoose のエラー Cast to ObjectId failed for value XXX at path "_id" とは何ですか?

2022-04-21 03:06:20

質問

にリクエストを送信する場合 /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: パス "_id" にある値 "foo" に対する ObjectId へのキャストに失敗しました。

では、このエラーは何でしょうか?

解決方法は?

マングースの findById メソッドは id パラメータを、モデルの _id フィールドを作成し、マッチする doc を適切にクエリできるようにします。 これはObjectIdですが "foo" は有効な ObjectId ではないため、キャストは失敗します。

この現象は 41224d776a326fb40f000001 この文字列は有効な ObjectId であるためです。

これを解決する1つの方法は、(1) の前にチェックを追加することです。 findById の呼び出しで id が有効なObjectIdであるかどうか、このように確認します。

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