복붙노트

[MONGODB] 몽구스 오류 캐스트 ObjectId가 경로에서 값 XXX 실패 "_id"에 무엇입니까?

MONGODB

몽구스 오류 캐스트 ObjectId가 경로에서 값 XXX 실패 "_id"에 무엇입니까?

41224d776a326fb40f000001이 존재하지 않는 _id와 / 고객 / 41224d776a326fb40f000001 및 문서에 요청을 보낼 때 문서가 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는 몽구스는 "형식"이상한 오류가 반환됩니다 GET / 고객 / foo에와 (예를 들어, 내가 가정)으로 예상과 일치하지 않습니다

그래서이 오류가 무엇입니까?

해결법

  1. ==============================

    1.몽구스의 findById 메소드 방법은 할 수 있도록 제대로 쿼리 일치하는 문서에 대한 모델의 _id 필드의 형태에 id 매개 변수를 캐스팅합니다. 이것은 ObjectId가 있지만 캐스트가 실패 할 수 있도록 "foo는"유효한 ObjectId가 없습니다.

    몽구스의 findById 메소드 방법은 할 수 있도록 제대로 쿼리 일치하는 문서에 대한 모델의 _id 필드의 형태에 id 매개 변수를 캐스팅합니다. 이것은 ObjectId가 있지만 캐스트가 실패 할 수 있도록 "foo는"유효한 ObjectId가 없습니다.

    해당 문자열이 유효한 ObjectId가 있기 때문 41224d776a326fb40f000001으로 발생하지 않습니다.

    이 문제를 해결하는 한 가지 방법은 ID가과 같이 유효한 ObjectId가인지 아닌지 확인하기 위해 findById 메소드 호출하기 전에 검사를 추가하는 것입니다 :

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

    2.OBJECTID를 확인하기 위해 기존의 기능을 사용합니다.

    OBJECTID를 확인하기 위해 기존의 기능을 사용합니다.

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

    3.당신은 ObjectId가 아니라 해당 문자열을 구문 분석하고 있습니까?

    당신은 ObjectId가 아니라 해당 문자열을 구문 분석하고 있습니까?

    여기 내 응용 프로그램에서, 내가 할 것입니다 :

    ObjectId.fromString( myObjectIdString );
    
  4. ==============================

    4.저도 같은 문제 I 추가 기능을 가지고 _id : 문자열 .IN 스키마는 다음 작업을 시작합니다

    저도 같은 문제 I 추가 기능을 가지고 _id : 문자열 .IN 스키마는 다음 작업을 시작합니다

  5. ==============================

    5.나는 경로 매개 변수를 잡기 다른 경로의 상단에 내 경로를 이동했다 :

    나는 경로 매개 변수를 잡기 다른 경로의 상단에 내 경로를 이동했다 :

    // 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);
    
  6. ==============================

    6.당신은 또한 다음과 같은 ObjectId.isValid을 사용할 수 있습니다 :

    당신은 또한 다음과 같은 ObjectId.isValid을 사용할 수 있습니다 :

    if (!ObjectId.isValid(userId)) return Error({ status: 422 })
    
  7. ==============================

    7.이것은 오래된 질문이지만, 당신은 또한 요청 PARAMS을 확인하는 표현-검증 패키지를 사용할 수 있습니다

    이것은 오래된 질문이지만, 당신은 또한 요청 PARAMS을 확인하는 표현-검증 패키지를 사용할 수 있습니다

    특급 - 검증 버전 4 (최신)

    validator = require('express-validator/check');
    
    app.get('/show/:id', [
    
        validator.param('id').isMongoId().trim()
    
    ], function(req, res) {
    
        // validation result
        var errors = validator.validationResult(req);
    
        // check if there are errors
        if ( !errors.isEmpty() ) {
            return res.send('404');
        }
    
        // else 
        model.findById(req.params.id, function(err, doc) { 
            return res.send(doc);
        });
    
    });
    

    특급 - 검증 버전 3 :

    var expressValidator = require('express-validator');
    app.use(expressValidator(middlewareOptions));
    
    app.get('/show/:id', function(req, res, next) {
    
        req.checkParams('id').isMongoId();
    
        // validation result
        req.getValidationResult().then(function(result) {
    
            // check if there are errors
            if ( !result.isEmpty() ) {
                return res.send('404');
            }
    
            // else
            model.findById(req.params.id, function(err, doc) {
                return res.send(doc);
            });
    
        });
    
    });
    
  8. ==============================

    8.

     if(mongoose.Types.ObjectId.isValid(userId.id)) {
            User.findById(userId.id,function (err, doc) {
                if(err) {
                    reject(err);
                } else if(doc) {
                    resolve({success:true,data:doc});
                } else {
                    reject({success:false,data:"no data exist for this id"})
    
                }
            });
            } else {
                reject({success:"false",data:"Please provide correct id"});
            }
    

    최고의 유효성을 확인하는 것입니다

  9. ==============================

    9.

    //Use following to check if the id is a valid ObjectId?
    
    var valid = mongoose.Types.ObjectId.isValid(req.params.id);
    if(valid)
    {
      //process your code here
    } else {
      //the id is not a valid ObjectId
    }
    
  10. ==============================

    10.나는 검증 방법으로 캐스팅 ObjectId가의 실패를 활용하여 원래의 코드를 감싸 시도 - 캐치에 캐스팅 ObjectId가 구현의 @gustavohenke 솔루션의 적응으로 갔다.

    나는 검증 방법으로 캐스팅 ObjectId가의 실패를 활용하여 원래의 코드를 감싸 시도 - 캐치에 캐스팅 ObjectId가 구현의 @gustavohenke 솔루션의 적응으로 갔다.

    Controller.prototype.show = function(id, res) {
      try {
        var _id = mongoose.Types.ObjectId.fromString(id);
    
    
    
        // the original code stays the same, with _id instead of id:
    
        this.model.findById(_id, function(err, doc) {
          if (err) {
            throw err;
          }
          if (!doc) {
            res.send(404);
          }
          return res.send(doc);
        });
    
    
    
      } catch (err) {
        res.json(404, err);
      }
    };
    
  11. ==============================

    11.또는 당신은이 작업을 수행 할 수 있습니다

    또는 당신은이 작업을 수행 할 수 있습니다

    VAR ObjectId가 =은 ( '몽구스')를 필요로 Types.ObjectId을.; VAR OBJID 새로운 ObjectId가 = ((param.length <12) "123456789012": PARAM);

    $ 또는 조건 여기 몽구스의 찾기 방법을 언급 한 바와 같이 제대로 작동하지 않습니다

  12. ==============================

    12.항상이 앱이 충돌하지 않습니다 결과로 쿼리를 실행하기 전에 id 필드의 타당성을 검증 쿼리에 조건 mongoose.Types.ObjectId ( '아이디')를 사용합니다.

    항상이 앱이 충돌하지 않습니다 결과로 쿼리를 실행하기 전에 id 필드의 타당성을 검증 쿼리에 조건 mongoose.Types.ObjectId ( '아이디')를 사용합니다.

  13. ==============================

    13.내가이 문제를 해결하는 방법은 문자열로 ID를 변환입니다

    내가이 문제를 해결하는 방법은 문자열로 ID를 변환입니다

    나는 그것을 역음 공상을 좋아한다 :     `$ {ID}`

    이없이 오버 헤드 문제를 해결해야한다

  14. ==============================

    14.ObjectId가이 일을 다음으로 구성되어 있습니다.

    ObjectId가이 일을 다음으로 구성되어 있습니다.

    ObjectId가 유효한지 확인하려면 올바른 방법은 ObjectId가 클래스 자체에서 정적 인 방법을 사용하는 것입니다.

    mongoose.Types.ObjectId.isValid (sample_object_id)

  15. ==============================

    15.ObjectId가에 문자열 캐스트

    ObjectId가에 문자열 캐스트

    import mongoose from "mongoose"; // ES6 or above
    const mongoose = require('mongoose'); // ES5 or below
    
    let userid = _id
    console.log(mongoose.Types.ObjectId(userid)) //5c516fae4e6a1c1cfce18d77
    
  16. ==============================

    16.탐지 및 ObjectId가 오류를 수정 나는 몽구스를 사용하여 항목을 삭제하려고이 문제에 발견과 같은 오류가 발생했습니다. 반환 문자열을 통해 찾고 후, 나는 나를 위해 오류가 발생한 반환 된 문자열 내부의 여분의 공백이 있었다 발견했다. 그래서, 나는 그 잘못된 ID를 검색 문자열에서 여분의 공백을 제거하기 위해 여기에 제공된 답변의 몇 가지 적용했다. 여기에 마지막으로 문제를 해결하기 위해 나를 위해 일한 코드입니다.

    탐지 및 ObjectId가 오류를 수정 나는 몽구스를 사용하여 항목을 삭제하려고이 문제에 발견과 같은 오류가 발생했습니다. 반환 문자열을 통해 찾고 후, 나는 나를 위해 오류가 발생한 반환 된 문자열 내부의 여분의 공백이 있었다 발견했다. 그래서, 나는 그 잘못된 ID를 검색 문자열에서 여분의 공백을 제거하기 위해 여기에 제공된 답변의 몇 가지 적용했다. 여기에 마지막으로 문제를 해결하기 위해 나를 위해 일한 코드입니다.

    const mongoose = require("mongoose");
    mongoose.set('useFindAndModify', false);  //was set due to DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify`
    
    
    
    app.post("/delete", function(req, res){
      let checkedItem = req.body.deleteItem;
      if (!mongoose.Types.ObjectId.isValid(checkedItem)) {
        checkedItem = checkedItem.replace(/\s/g, '');
      }
    
      Item.findByIdAndRemove(checkedItem, function(err) {
        if (!err) {
          console.log("Successfully Deleted " + checkedItem);
            res.redirect("/");
          }
        });
    });
    

    이것은 나를 위해 일한 및 기타 항목들이 유사한 방법으로 제거 할 수 있습니다 반환 문자열에 나타나기 시작하면 나는 가정합니다.

    이게 도움이 되길 바란다.

  17. ==============================

    17.사람이로 실행되는 경우, 무엇 나를 위해 그것을 해결하는 것은이`에 필요에 작은 따옴표로 변경했다.

    사람이로 실행되는 경우, 무엇 나를 위해 그것을 해결하는 것은이`에 필요에 작은 따옴표로 변경했다.

    대신에:

    const something = require('./models/something');
    

    용도:

    const something = require(`./models/something`);
    

    이 재미 소리로 들리 겠지만 실제로 작동합니다.

  18. ==============================

    18.내 경우, 나는 _id 추가했다 : 내 스키마에 오브젝트를 한 다음 모든 벌금을했다.

    내 경우, 나는 _id 추가했다 : 내 스키마에 오브젝트를 한 다음 모든 벌금을했다.

  19. from https://stackoverflow.com/questions/14940660/whats-mongoose-error-cast-to-objectid-failed-for-value-xxx-at-path-id by cc-by-sa and MIT license