执行删除

时间:2017-07-03 21:27:07

标签: node.js mongodb mongoose

我遇到了以下错误,但我无法完全掌握错误背后的理解。

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'作为参数。此值用于从数据库中删除相应的对象。

1 个答案:

答案 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()。这样一次只能删除一个文档。如果有多个具有相同名称的合作伙伴,则会删除第一个合作伙伴(具体取决于您的排序顺序)。

相关问题