#node.js #mongodb #express #mongoose
#node.js #mongodb #выразить #мангуст
Вопрос:
Я пытаюсь удалить запись из MongoDB. Мой экспресс-код выглядит следующим образом
const deleteAddress = (req, res, next) => {
var curid = req.params.id;
curid = curid.replace(/s/g, '');
Address.findByIdAndRemove(curid)
.then(result => {
res.status(200).json({
message: 'Address Deleted',
result
});
})
.catch(err => {
console.log(err);
res.status(500).json({
message: 'Error Occured',
error: err
});
});
}
Я получаю ошибку, подобную приведенной ниже
{ CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Address"
[0] at new CastError (/home/foysal/Videos/my-app/node_modules/mongoose/lib/error/cast.js:29:11)
[0] at ObjectId.cast (/home/foysal/Videos/my-app/node_modules/mongoose/lib/schema/objectid.js:242:11)
[0] at ObjectId.SchemaType.applySetters (/home/foysal/Videos/my-app/node_modules/mongoose/lib/schematype.js:845:12)
[0] at ObjectId.SchemaType._castForQuery (/home/foysal/Videos/my-app/node_modules/mongoose/lib/schematype.js:1248:15)
[0] at ObjectId.SchemaType.castForQuery (/home/foysal/Videos/my-app/node_modules/mongoose/lib/schematype.js:1238:15)
[0] at ObjectId.SchemaType.castForQueryWrapper (/home/foysal/Videos/my-app/node_modules/mongoose/lib/schematype.js:1217:15)
[0] at cast (/home/foysal/Videos/my-app/node_modules/mongoose/lib/cast.js:307:32)
[0] at model.Query.Query.cast (/home/foysal/Videos/my-app/node_modules/mongoose/lib/query.js:4340:12)
[0] at castQuery (/home/foysal/Videos/my-app/node_modules/mongoose/lib/query.js:4192:18)
[0] at model.Query.Query._findAndModify (/home/foysal/Videos/my-app/node_modules/mongoose/lib/query.js:3204:23)
[0] at model.Query.<anonymous> (/home/foysal/Videos/my-app/node_modules/mongoose/lib/query.js:3165:8)
[0] at model.Query._wrappedThunk [as _findOneAndRemove] (/home/foysal/Videos/my-app/node_modules/mongoose/lib/helpers/query/wrapThunk.js:16:8)
[0] at process.nextTick (/home/foysal/Videos/my-app/node_modules/kareem/index.js:369:33)
[0] at process._tickCallback (internal/process/next_tick.js:61:11)
[0] message:
[0] 'Cast to ObjectId failed for value "undefined" at path "_id" for model "Address"',
[0] name: 'CastError',
[0] stringValue: '"undefined"',
[0] kind: 'ObjectId',
[0] value: 'undefined',
[0] path: '_id',
[0] reason: undefined,
[0] model:
[0] { [Function: model]
[0] hooks: Kareem { _pres: [Map], _posts: [Map] },
[0] base:
[0] Mongoose {
[0] connections: [Array],
[0] models: [Object],
[0] modelSchemas: [Object],
[0] options: [Object],
[0] _pluralize: [Function: pluralize],
[0] Schema: [Function],
[0] model: [Function],
[0] plugins: [Array] },
[0] modelName: 'Address',
[0] model: [Function: model],
[0] db:
[0] NativeConnection {
[0] base: [Mongoose],
[0] collections: [Object],
[0] models: [Object],
[0] config: [Object],
[0] replica: false,
[0] options: null,
[0] otherDbs: [],
[0] relatedDbs: {},
[0] states: [Object],
[0] _readyState: 1,
[0] _closeCalled: false,
[0] _hasOpened: true,
[0] '$internalEmitter': [EventEmitter],
[0] _listening: false,
[0] _connectionOptions: [Object],
[0] name: 'addresses',
[0] host: 'localhost',
[0] port: 27017,
[0] user: undefined,
[0] pass: undefined,
[0] client: [MongoClient],
[0] '$initialConnection': [Promise],
[0] _events: [Object],
[0] _eventsCount: 2,
[0] db: [Db] },
[0] discriminators: undefined,
[0] events:
[0] EventEmitter { _events: {}, _eventsCount: 0, _maxListeners: undefined },
Комментарии:
1. Похоже, что
curid
вы передаете этоundefined
, проверьте это перед передачей в запрос mongo.2. Поскольку вы, похоже, отделили свое определение «обработчика маршрута» от метода, убедитесь, что вы вообще передаете
id
туда. Там должно быть определено что-то вродеroute.delete('/yourpath/:id', deleteAddress)
. Без:id
req.params.id
будетundefined
. Обратите внимание также, что в вашем запросе должен использоватьсяDELETE
глагол и включатьсяid
в path. т.е.DELETE /yourpath/5ca97bf60c3b7005121b2e21
Ответ №1:
могут быть две причины, как сказал kgangadhar, вы бы не получили curid
, во-вторых, если вы получаете curid
то, что вы передали в качестве ObjectId, вы бы получили stringID
var ObjectId = Schema.ObjectId
const deleteAddress = (req, res, next) => {
var curid = new ObjectId(req.params.id);
curid = curid.replace(/s/g, '');
Address.findByIdAndRemove(curid)
.then(result => {
res.status(200).json({
message: 'Address Deleted',
result
});
})
.catch(err => {
console.log(err);
res.status(500).json({
message: 'Error Occured',
error: err
});
});
}
Комментарии:
1. Mongoose фактически автоматически выполняет приведение к
ObjectId
на основе схемы, определенной с помощью таких методов, какfindByIdAndRemove()
(и любых других методов, если на то пошло). Конкретная ошибка на самом деле также говоритundefined
, поэтому приведение вручную не имело бы никакого значения вообще.