MongoDB
[mongoDB] Cast to ObjectId failed for value (type string) 에러
김만규
2024. 5. 19. 11:47
728x90
반응형
이번에 Node.js, mongoDB 사용을 하면서 프로젝트 진행 중 예외처리를 만드는 중 mongoDB에서 에러가 발생을 하였다.
// 실행한 코드
router.get("/api/product/:id", async (req, res) => {
try {
const { id } = req.params;
const goodsItem = await product.findById(id).select("-password").exec(); // 에러 발생 부분
if (!goodsItem) {
return res.status(404).json({ errorMessage: "존재하지 않는 상품입니다." });
}
return res.status(200).json({ message: "상품 상세 조회에 성공했습니다.", data: goodsItem });
} catch (error) {
console.error(error);
return res.status(500).json({ errorMessage: "서버 에러가 발생했습니다." });
}
});
CastError: Cast to ObjectId failed for value "6645a82eb01b0636c64" (type string) at path "_id" for model "Product"
at SchemaObjectId.cast (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/schema/objectId.js:250:11)
at SchemaType.applySetters (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/schemaType.js:1236:12)
at SchemaType.castForQuery (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/schemaType.js:1653:17)
at cast (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/cast.js:375:32)
at Query.cast (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:4785:12)
at Query._castConditions (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:2199:10)
at model.Query._findOne (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:2513:8)
at model.Query.exec (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:4329:80)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/src/routers/products.router.js:147:23 {
stringValue: '"6645a82eb01b0636c64"',
messageFormat: undefined,
kind: 'ObjectId',
value: '6645a82eb01b0636c64',
path: '_id',
reason: BSONError: input must be a 24 character hex string, 12 byte Uint8Array, or an integer
at new ObjectId (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/node_modules/bson/lib/bson.cjs:2361:23)
at castObjectId (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/cast/objectid.js:25:12)
at SchemaObjectId.cast (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/schema/objectId.js:248:12)
at SchemaType.applySetters (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/schemaType.js:1236:12)
at SchemaType.castForQuery (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/schemaType.js:1653:17)
at cast (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/cast.js:375:32)
at Query.cast (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:4785:12)
at Query._castConditions (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:2199:10)
at model.Query._findOne (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:2513:8)
at model.Query.exec (/Users/gimmangyu/Desktop/sparta/sprat-Node.js-introduction/node_modules/mongoose/lib/query.js:4329:80),
valueType: 'string',
model: Model { Product }
}
현재 에러는 MogoDb에서 ObjectId는 12bit 길이의 16진수 문자열이다. 예외처리 테스트 중 우리는 서버에 보내는 id값을 24자리 수 절반인 12자리 수를 보내니 이러한 에러가 발생을 하였다 mongoDB에서는 12자리 수 데이터를 받으니 ObjectId값이 아닌 string 값으로 받게 되어 에러가 발생을 하게 되는것이다.
router.get("/product/:id", async (req, res) => {
try {
const { id } = req.params;
const isValidObjectId = mongoose.Types.ObjectId.isValid(id);
if (!isValidObjectId) {
return res.status(400).json({ errorMessage: "잘못된 상품 ID 형식입니다." });
}
const goodsItem = await product.findById(id).select("-password").exec();
if (!goodsItem) {
return res.status(404).json({ errorMessage: "존재하지 않는 상품입니다." });
}
return res.status(200).json({ message: "상품 상세 조회에 성공했습니다.", data: goodsItem });
} catch (error) {
console.error(error);
return res.status(500).json({ errorMessage: "서버 에러가 발생했습니다." });
}
});
나 같은 경우는 mongoose를 사용하여 id 데이터타입을 ObjercId값으로 변환하여 데이터를 전달하였다.
이렇게 변환함으로써 아까와 같은 에러는 사라지고 내가 원하는 예외처리 잘못된 상품 ID 형식이라고 클라이언트에게 전달이된다.
728x90
반응형