2016-06-23 2 views
1

nodeJSを使用してMongoDBから文書を削除しようとしています。MongoDB _idの長さが25になる

私のコードの流れは以下の通りです: 1.ユーザーは特定の生徒を削除できます。 2.私はすべての学生書類を引っ張ってDBに保存し、学生オブジェクトに保存しました。 3.ユーザーは、提供されたテキストボックスで検索をフィルタリングし、特定の生徒を選択して削除することができます。

UIの下に見つけてください:

UI

HTMLページを以下のように:UIに関連付けられたangularJSコントローラは以下の通りです

<h2 align="center">Delete Student</h2> 
<div ng-controller="deleteStudentController"> 
<form ng-submit="deleteStudent()"> 
    Student Name:<input type="text" letters-only ng-model="searchName"/><br> 
    <div ng-repeat="student in students | filter:searchName" ng-show="searchName.length"> 
     <input type="radio" ng-model="$parent.studentRadio" name="studentRadio" value="{{student._id}}"/>{{student | formatter}} 
    </div> 
    <input type="submit" value="Delete Student"/> 
    {{output}} 
    </form> 
    </div> 

mainApp.controller("deleteStudentController", function($scope,$http) { 
var resData = {}; 
$scope.student = {}; 
var urlGet = "/students/all"; 
$http.get(urlGet) 
.then(function(response) { 
    $scope.students = angular.fromJson(response.data); 
}); 
$scope.deleteStudent = function(){ 
    var urlDelete = "/students/remove:"+$scope.studentRadio; 
    $http.delete(urlDelete) 
    .success(function(response, status, headers, config){ 
     $scope.output = "Student successfully deleted."; 
    }) 
    .error(function(response, status, headers, config){ 
     $scope.output = "Error in processing. Please try again."; 
    }); 
    } 
    }); 

どのイントゥーンがノードコントローラを呼び出すか:

router.delete("/remove:studId", function(req,res){ 
Students.remove(req.params.studId, function(err) { 
    if (err) { 
     throw err; 
    } 
    else { 
     var respOut = "Student deleted"; 
     res.send(respOut); 
    } 
}); 
}); 

コントローラ内には、DB通信が行われる受講生モデルのオブジェクトがあります。

exports.remove = function(studentId, cb) { 
var collection = db.get().collection('students'); 
console.log("_id"+studentId); 
console.log("Length---->"+studentId.length); 
collection.remove({_id: mongodb.ObjectID.createFromHexString(studentId)}, function(err) { 
    if (err) { 
     throw err; 
    } 
    else { 
    cb(err); 
    console.log("Record deleted."); 
    } 
}); 
} 

しかし、そののようにエラーを与える:私は、ドキュメントを削除するには、DB

から学生モデルのコードを持って_id値からオブジェクトIDを作成するためのmongodb.ObjectID.createFromHexString()メソッドを使用していました"エラー:渡される引数は、12バイトの単一の文字列または24の16進文字の文字列でなければなりません"。だから私はDB学生の文書とその長さから得た_id値を記録しようとしました。驚いたことに私は長さを '25'にしています。

私は取得していますことを、以下のコンソールを見つけるしてください:

_id:この問題について576aba09090560f80bd2caaa 長----> 25

任意のアイデアを?

"/students/remove:"+$scope.studentRadio 

私はあなたが:があるにしたいと仮定し、そのURLは次のようになります:助けてください.....

+0

_idの長さ上記は24です。「studentId」とは何ですか?どうやってそれを手に入れますか? – freakish

+0

はい。しかし、私は長さを25にしています。私はコンソールを作りました: console.log( "Length ---->" + studentId.length); 長さ25の理由を教えてください: –

+0

@JohnyHK私の質問は更新されました。どうぞご覧ください。何かを提供する必要がある場合は教えてください。 –

答えて

2

あなたの角度のコードは次のようにエンドポイントを設定している

/students/remove:576c1d4781aaa4f16a68af24 

あなたのエクスプレスルートは次のようになります。

router.delete("/remove:studId", ...) 

:は、studIdと呼ばれるnamed parameterを宣言するExpressルートの特殊文字です。つまり、/removeの後のすべてのルートで、studId,の値になります。のURLにはコロンが入ります。したがって、req.params.studId:576c1d4781aaa4f16a68af24で、長さは25文字です。

あなたはURLスキームのこの種を使用する場合は、あなたが(それはその特別な意味を失い)、それをエスケープすることにより、大腸は試合の一部であることを行う必要があります。

router.delete("/remove\\::studId", ...) 
+0

ありがとうございました。 –

関連する問題