2017-07-03 7 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を指定する必要があります:http://localhost:8443/data/59558ccd7acc4dd63ea88988

Model.findByIdAndRemove(id, [options], [callback]) 

あなたの削除のAPIコールは、このようなものを見ることができます。ただし、このためにクライアントはパートナーのObjectIdを知る必要があります。

URL内のパートナーのObjectIdを使用するか、remove()を使用してカスタム削除クエリを実装する必要があります(たとえば、名前がパートナー名を格納するプロパティの場合)

Partner.remove({ name: partnerName }).exec(); 

しかし、あなたのパートナーの名前が一意でない場合削除はクエリに一致するすべての文書を削除しますと、これは、複数のドキュメントを削除するかもしれないことに注意してください。

これを防ぐには、同じクエリを使用してfindOneAndRemove()を使用することもできます。これにより、一度に1つの文書しか削除されません。同じ名前のパートナーが複数ある場合は、最初のメンバーを削除します(ソート順に応じて)。

+0

外見remove()は私の場合はジョブを実行するはずですが、findOneAndRemove()を呼び出す場合は好奇心がかかり、そのパラメータ値のObjectidにどうやってアクセスしますか? – user8222014

+0

パートナーの名前(XYZ)ではなく、URLのObjectIdを使用してAPIを削除することができます。たとえば、http:// localhost:8443/data/59558ccd7acc4dd63ea88988 - >私の更新された回答を参照してください。 – benjiman

+0

これは非常にユーザーフレンドリーではないと思いますが、ObjectIdは実際には人間のために作られていません;)しかし、通常は、アイテムを削除するために何かを入力するようユーザーに求めません。彼はパートナーリストなどのエントリのリンク(削除など)をクリックするだけで、アプリケーションはそのIDを知って使用して削除を実行します。しかし、どのアプリケーションを構築しているのか正確にはわからないので、あなたのケースに最適なものが何であるかはわかりません。 – benjiman