我遇到了以下错误,但我无法完全掌握错误背后的理解。
CastError: Cast to ObjectId failed for value "XYZ" at path "_id" for model "Partner"
我的架构定义如下
var partnerList = new Schema (
{
partnerName: String,
supportedProducts: [String]
},
{
collection: 'partnerList'
}
);
module.exports = mongoose.model('Partner', partnerList);
我删除功能的功能
delete: function (req, res) {
var removePartner = req.params.partnerName;
var promise = Partner.findByIdAndRemove(removePartner).exec();
promise.then(function removePartner(val) {
console.log('partner value removed');
res.send(val);
}).catch(function catchError(err){
console.error(err);
throw err;
});
}
我正在尝试使用我的节点应用服务请求 localhost:8443 / data / XYZ ,其中我传递了值' XYZ'作为参数。此值用于从数据库中删除相应的对象。
答案 0 :(得分:0)
基本上错误意味着无论你传递的是什么,你的" XYZ" url param不是有效的ObjectId。
根据您的代码猜测,您使用"合作伙伴名称" (可能是一些任意字符串)而不是伙伴的数据库ID。但是findByIdAndRemove()
要求您指定ObjectId,因为它使用它来标识要删除的文档:
Model.findByIdAndRemove(id, [options], [callback])
您的删除API调用可能如下所示:http://localhost:8443/data/59558ccd7acc4dd63ea88988
。但是,为此,客户需要知道合作伙伴的ObjectId。
所以你必须在URL中使用合作伙伴的ObjectId,或者使用remove()
来实现自定义删除查询,例如这样(如果name是用于存储合作伙伴名称的属性) ):
Partner.remove({ name: partnerName }).exec();
小心但如果您的合作伙伴名称不唯一,则可能会删除多个文档,因为删除会删除与查询匹配的所有文档。
为了防止这种情况,您还可以使用相同的查询findOneAndRemove()
。这样一次只能删除一个文档。如果有多个具有相同名称的合作伙伴,则会删除第一个合作伙伴(具体取决于您的排序顺序)。