몽구스:CastError: 경로 "_id"에서 값 "개체 개체"에 대해 ObjectId로 캐스팅하지 못했습니다.
node.js는 처음이라 간과하고 있는 바보 같은 생각이 듭니다만, 문제를 해결할 수 있는 답을 찾을 수 없었습니다.이 작업은 새 하위 개체를 생성하여 부모의 자식 배열에 추가한 다음 요청자에게 하위 개체를 반환하는 경로를 만듭니다.여기서 발생하는 문제는 문자열 ID를 findById에 전달하면 노드가 크래시하고
TypeError: {} 개체에 메서드 '캐스트'가 없음
대신 ObjectId를 전달하려고 하면
CastError: 경로 "_id"에서 값 "개체 개체"에 대해 ObjectId로 캐스팅하지 못했습니다.
다음은 제 코드의 대략적인 개요입니다.
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
경로 "/myClass/51c35e5ced18cb901d000001/childClass/create"에서 이 코드를 실행하면 다음과 같이 출력됩니다.
오류: CastError: 경로 "_id" {"path":51c35e5ced18cb901d000001", "instance":: 객체의 값 "[Object]"에 대한 캐스트가 실패했습니다.ID","검증자":[],"setters":[],"getters":[],"_index":null}
findOne을 사용하여 대신 {_id:id}을(를) 전달하려고 시도했지만, 이것이 정확히 findById의 기능인 것 같습니다.다른 사이트에서 본 ObjectId에 대해 여러 클래스를 시도했습니다.컨스트럭터가 아닌 함수처럼 ObjectId()를 호출하려고 시도했지만 정의되지 않은 상태로 반환되었습니다.이 시점에서, 저는 아이디어가 부족하고, 답을 찾기 위해 구글을 검색하는 것은 도움이 되지 않는 것 같습니다.제가 뭘 잘못하고 있는지 아세요?
또, 말씀드렸다시피, 저는 node/Mongo/Mongoose/Express를 처음이기 때문에, 제 목표를 달성할 수 있는 더 좋은 방법이 있으면 가르쳐 주세요.모든 피드백에 감사드립니다.
편집:
Peter Lyons로부터의 회피책 후에, 다른 에러를 검색해 보니, findByIdAndUpdate 가 정상적으로 동작해, 원하는 대로 동작하고 있었습니다.FindById와 FindOne 중 하나가 왜 이런 문제를 일으켰는지 모르겠고 궁금하기 때문에 (아마 버그 보고서를 작성해야 할 것 같습니다) 다른 사람이 답을 가지고 있을 때를 대비해서 열어두겠습니다.
간단한 답변: 몽구스를 사용하세요.Types.ObjectId.
Mongoose(Mongo는 제외)는 오브젝트 ID를 문자열로 받아들여 적절한 "캐스팅"을 할 수 있으므로 다음과 같이 사용합니다.
MyClass.findById(req.params.id)
는 " " " 입니다.req.params.ido mongo ID 。이 경우 예외는 검출해야 합니다.
은 '우리'가 '우리'가 '우리'가 아니라 ''는 '우리'가 아니라 '우리'가'라는 거예요mongoose.SchemaTypes정의할 과 mongoose 스키마를 정의할 때 사용하는 내용이 .mongoose.Types에는 데이터베이스에 저장할 데이터 개체를 만들거나 개체를 쿼리할 때 사용하는 항목이 있습니다. ★★★★★★★★★★★★★★★★★.mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")는 데이터베이스에 저장하거나 쿼리에서 사용할 수 있는 개체를 제공하며 비활성 ID 문자열이 지정되면 예외를 발생시킵니다.
findOne는 쿼리 오브젝트를 취득하여 단일 모델인스턴스를 콜백에 전달합니다. ★★★★★★★★★★★★★★★★★.findById말 그대로 의 포장지입니다.findOne({_id: id})(여기서 소스 코드를 참조).그저.find는 쿼리 오브젝트를 취득하여 일치하는 모델인스턴스 배열을 콜백에 전달합니다.
그냥 천천히 가.혼란스럽지만, 현시점에서는 몽구스의 벌레에 부딪히지 않고 혼란스러워하고 있는 것은 확실합니다.꽤 성숙한 도서관이지만, 요령을 터득하는 데는 시간이 좀 걸린다.
의 또 다른 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★new 시ChildClass그 외에 남아 있는 CastError를 추적하기 위해 스키마 코드를 게시해야 합니다.
이 에러는, _id 필드에서 필터링 하는 값이 ID 형식이 아니기 때문에, 「if」로 해결할 수 있습니다.
const mongoose = require('mongoose');
console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// true
console.log(mongoose.Types.ObjectId.isValid('whatever'));
// false
이 문제를 해결하려면 검색 기준 값이 유효한 ObjectId인지 항상 확인하십시오.
const criteria = {};
criteria.$or = [];
if(params.q) {
if(mongoose.Types.ObjectId.isValid(params.id)) {
criteria.$or.push({ _id: params.q })
}
criteria.$or.push({ name: { $regex: params.q, $options: 'i' }})
criteria.$or.push({ email: { $regex: params.q, $options: 'i' }})
criteria.$or.push({ password: { $regex: params.q, $options: 'i' }})
}
return UserModule.find(criteria).exec(() => {
// do stuff
})
모든 같은 했고, 같은 오류를 했다._id필드가 비어 있습니다.
나는 여기에 그것을 더 자세히 설명했다.의 필드를 변경하는 것 이외에는 아직 해결 방법을 찾지 못했습니다._id필드 식별을 하지 않는 건 나한테는 더러운 해킹이야.몽구스의 버그 리포트를 제출할 것 같아요.어떤 도움이라도 주시면 감사하겠습니다!
집:: 스스드스스업업업업업업업업다다.를 했더니 분실 _id현재 출시 후보가 있는 4.x.x 버전으로 수정될 예정입니다.사용을 하지 않습니다!rc 는는 !rc !!!! 。
이 문제가 발생하고 있는 경우, 라인상의 어딘가에서 입력을 실행하고 있는 경우는, 이 Mongoose 문제를 참조해 주세요.
Mongoose 4.0으로 업데이트하면 문제가 해결되었습니다.
같은 문제가 있어서 신분증을 끈으로 묶었어요
내 스키마:
const product = new mongooseClient.Schema({
retailerID: { type: mongoose.SchemaTypes.ObjectId, required: true, index: true }
});
그리고 삽입할 때:
retailerID: `${retailer._id}`
스키마를 업데이트한 후 동일한 문제가 발생했는데, 제가 작성한 이전 ID를 사용하여 모델을 호출하는 것을 잊어버리고 다음과 같은 방법으로 스키마를 업데이트했습니다.
patientid: {
type: String,
required: true,
unique: true
},
로.
patientid: { type: mongoose.SchemaTypes.ObjectId, ref: "Patient" },
보니 내 커서 를 .findOne따라서 문제가 발생합니다.
다른 사람을 돕기 위해 여기에 글을 올립니다: 알 수 없는 잘못된 전화를 위해 코드를 체크해 주세요! 문제일 수도 있고, 당신의 큰 머리도 보호할 수 있습니다!
해결방법은 모든 문서의 데이터를 원하지만 _id는 원하지 않습니다.
User.find({}, {_id:0, keyToShow:1, keyToNotShow:0})
스키마를 생성한 후 경로 "_id"에서 "CastError: Cast to ObjectId"라는 오류가 발생했습니다. 스키마를 수정한 후 값을 추적할 수 없습니다.컬렉션에 있는 모든 문서를 삭제했고 오브젝트 1개는 추가할 수 있었지만 1개는 추가할 수 없었습니다.나는 결국 몽고에서 컬렉션을 삭제했고 몽구스가 컬렉션을 다시 만들었을 때 작동했다.
기록의 경우:하위 문서를 잘못된 방법으로 채우려다가 다음 오류가 발생했습니다.
{
[CastError: Cast to ObjectId failed for value "[object Object]" at path "_id"]
message: 'Cast to ObjectId failed for value "[object Object]" at path "_id"',
name: 'CastError',
type: 'ObjectId',
path: '_id'
value:
[ { timestamp: '2014-07-03T00:23:45-04:00',
date_start: '2014-07-03T00:23:45-04:00',
date_end: '2014-07-03T00:23:45-04:00',
operation: 'Deactivation' } ],
}
look ^ value는 객체를 포함하는 배열입니다.잘못되었습니다!
설명:다음과 같이 php에서 node.js API로 데이터를 전송했습니다.
$history = json_encode(
array(
array(
'timestamp' => date('c', time()),
'date_start' => date('c', time()),
'date_end' => date('c', time()),
'operation' => 'Deactivation'
)));
보시다시피 $history는 배열을 포함하는 배열입니다.그래서 mongoose는 _id(또는 다른 필드)를 Scheme가 아닌 배열로 채우려고 합니다.ObjectId(또는 기타 데이터 유형).다음과 같은 기능이 있습니다.
$history = json_encode(
array(
'timestamp' => date('c', time()),
'date_start' => date('c', time()),
'date_end' => date('c', time()),
'operation' => 'Deactivation'
));
도움이 될지는 모르겠지만 아래와 같이 mongoose를 Import하여 아래와 같이 구현하여 문제를 해결하였습니다.
const mongoose = require('mongoose')
_id: new mongoose.Types.ObjectId(),
이 mongoose 오류도 발생하였습니다.
CastError: Cast to ObjectId failed for value \"583fe2c488cf652d4c6b45d1\" at path \"_id\" for model User
그래서 로컬에서 mongodb와 mongoose 버전을 확인하기 위해 npm list 명령을 실행합니다.보고서는 다음과 같습니다.
......
......
├── mongodb@2.2.19
├── mongoose@4.7.2
.....
이 mongodb 버전에 문제가 있는 것 같아서 2.2.16과 같은 다른 버전을 제거하고 사용하려고 했습니다.
$ npm uninstall mongodbnode_mongodb "mongodb" 에서 가몽고답
$ npm install mongodb@2.2.16
드디어 앱을 재기동하면 CastError가 사라집니다.
나도 같은 문제를 겪고 있었다.알고보니 내 Node.js는 구식이었어업그레이드 후 동작하고 있습니다.
예를 들어 동작하는 경로를 변경하기만 하면 됩니다.
app.get('/myClass/:Id/childClass/create', function(request, result) .....
로 바꾸다.
app.get('/myClass**es**/:Id/childClass/create', function(request, result) .....
경로(myClass)에 --es--를 추가하여 (myClasses)가 되었습니다.
이것으로 동작하고, 에러는 표시되지 않게 됩니다.
저는 ID가 정의되어 있지 않습니다(req.params.id는 정의되어 있지 않습니다).
예를 들어 드라이버와 같이 모델에 대한 "_id"로 문서를 찾는 경우 다음 명령이 제대로 작동합니다.
....
const driver = await Drivers.findById(<your id>);
....
async-ait 및 try-catch ES6 구문을 사용하는 것을 확인합니다.
저는 데이터를 보내지 않고 put request를 사용하고 있었습니다.포스트 리퀘스트로 변경했더니 효과가 있었어요.
이 스레드에서는 put requests에 대해 자세히 설명합니다.
예를 들어 동작하는 경로를 변경하기만 하면 됩니다.
app.get('/myClass/:Id/childClass/create', function(request, result)
로 바꾸다.
app.get('/myClass**es**/:Id/childClass/create', function(request, result)
방금 덧붙였습니다.--es--경로(myClass)로 이동(myClasses)
이것으로 동작하고, 에러는 표시되지 않게 됩니다.
언급URL : https://stackoverflow.com/questions/17223517/mongoose-casterror-cast-to-objectid-failed-for-value-object-object-at-path
'programing' 카테고리의 다른 글
| MongoDB에 대한 '데이터 손실' 비판은 어느 정도 유효합니까? (0) | 2023.03.11 |
|---|---|
| jQuery를 사용한 병렬 비동기 Ajax 요청 (0) | 2023.03.11 |
| ASP.NET MVC: 레이저 뷰에서 컨트롤러 액션 메서드를 호출할 수 있는 모든 방법 (0) | 2023.03.11 |
| ng-app 지시어 배치(html vs body) (0) | 2023.03.11 |
| 새로운 React Context API는 재렌더를 트리거합니까? (0) | 2023.03.11 |