[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.몽구스의 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.OBJECTID를 확인하기 위해 기존의 기능을 사용합니다.
OBJECTID를 확인하기 위해 기존의 기능을 사용합니다.
var mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid('your id here');
-
==============================
3.당신은 ObjectId가 아니라 해당 문자열을 구문 분석하고 있습니까?
당신은 ObjectId가 아니라 해당 문자열을 구문 분석하고 있습니까?
여기 내 응용 프로그램에서, 내가 할 것입니다 :
ObjectId.fromString( myObjectIdString );
-
==============================
4.저도 같은 문제 I 추가 기능을 가지고 _id : 문자열 .IN 스키마는 다음 작업을 시작합니다
저도 같은 문제 I 추가 기능을 가지고 _id : 문자열 .IN 스키마는 다음 작업을 시작합니다
-
==============================
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.당신은 또한 다음과 같은 ObjectId.isValid을 사용할 수 있습니다 :
당신은 또한 다음과 같은 ObjectId.isValid을 사용할 수 있습니다 :
if (!ObjectId.isValid(userId)) return Error({ status: 422 })
-
==============================
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.
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.
//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.나는 검증 방법으로 캐스팅 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.또는 당신은이 작업을 수행 할 수 있습니다
또는 당신은이 작업을 수행 할 수 있습니다
VAR ObjectId가 =은 ( '몽구스')를 필요로 Types.ObjectId을.; VAR OBJID 새로운 ObjectId가 = ((param.length <12) "123456789012": PARAM);
$ 또는 조건 여기 몽구스의 찾기 방법을 언급 한 바와 같이 제대로 작동하지 않습니다
-
==============================
12.항상이 앱이 충돌하지 않습니다 결과로 쿼리를 실행하기 전에 id 필드의 타당성을 검증 쿼리에 조건 mongoose.Types.ObjectId ( '아이디')를 사용합니다.
항상이 앱이 충돌하지 않습니다 결과로 쿼리를 실행하기 전에 id 필드의 타당성을 검증 쿼리에 조건 mongoose.Types.ObjectId ( '아이디')를 사용합니다.
-
==============================
13.내가이 문제를 해결하는 방법은 문자열로 ID를 변환입니다
내가이 문제를 해결하는 방법은 문자열로 ID를 변환입니다
나는 그것을 역음 공상을 좋아한다 : `$ {ID}`
이없이 오버 헤드 문제를 해결해야한다
-
==============================
14.ObjectId가이 일을 다음으로 구성되어 있습니다.
ObjectId가이 일을 다음으로 구성되어 있습니다.
ObjectId가 유효한지 확인하려면 올바른 방법은 ObjectId가 클래스 자체에서 정적 인 방법을 사용하는 것입니다.
mongoose.Types.ObjectId.isValid (sample_object_id)
-
==============================
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.탐지 및 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.사람이로 실행되는 경우, 무엇 나를 위해 그것을 해결하는 것은이`에 필요에 작은 따옴표로 변경했다.
사람이로 실행되는 경우, 무엇 나를 위해 그것을 해결하는 것은이`에 필요에 작은 따옴표로 변경했다.
대신에:
const something = require('./models/something');
용도:
const something = require(`./models/something`);
이 재미 소리로 들리 겠지만 실제로 작동합니다.
-
==============================
18.내 경우, 나는 _id 추가했다 : 내 스키마에 오브젝트를 한 다음 모든 벌금을했다.
내 경우, 나는 _id 추가했다 : 내 스키마에 오브젝트를 한 다음 모든 벌금을했다.
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
'MONGODB' 카테고리의 다른 글
[MONGODB] 어떻게 새 개체는 기존에 / 병합을 오버레이 있도록 내가 부분적으로 MongoDB를에서 개체를 업데이트 할 (0) | 2019.12.01 |
---|---|
[MONGODB] MongoDB의에서 날짜별로 그룹화 (0) | 2019.12.01 |
[MONGODB] MongoDB를에 버전 데이터를 구현하는 방법 (0) | 2019.12.01 |
[MONGODB] 사용자 이름과 암호를 사용하여 MongoDB를 확보하는 방법 (0) | 2019.12.01 |
[MONGODB] 일치하는 파이프 라인에서 문서의 집계 $ 조회 총 크기는 최대 문서 크기를 초과 (0) | 2019.12.01 |