2017-07-03 59 views
0

我遇到以下錯誤,但無法完全理解錯誤背後的理解。執行刪除時的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; 
    }); 
} 

我試圖做出請求使用 本地主機我節點應用服務的功能:8443/data/XYZ,其中我傳遞值'XYZ'作爲參數。該值用於從數據庫中刪除適當的對象。

回答

0

基本上這個錯誤意味着無論您傳遞給您的「XYZ」url參數是不是有效的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()使用相同的查詢。這樣一次只能刪除一個文檔。如果有多個同名的合作伙伴,則會刪除第一個合作伙伴(具體取決於您的排序順序)。

+0

看起來remove()在我的情況下應該做的工作,但出於好奇心,如果我找到一個和刪除()我將如何訪問Objectid該參數值? – user8222014

+0

您將使用URL中的ObjectId而不是合作伙伴名稱(XYZ)進行刪除API調用。例如:http:// localhost:8443/data/59558ccd7acc4dd63ea88988 - >查看我更新的答案。 – benjiman

+0

然後我想這不是非常用戶友好的,因爲ObjectIds真的不是爲人類而製作的;)但是通常你不會要求用戶輸入任何內容來刪除一個項目。他只需點擊合作伙伴列表中的條目上的鏈接(例如刪除),然後應用程序就會知道並使用該標識符來執行刪除操作。但是因爲我不確切知道你在建什麼樣的應用程序,所以我不能說出最適合你的情況。 – benjiman