我正在尝试使用nodeJS从MongoDB中删除文档。
我的代码流程如下: 1.用户可以删除特定学生。 因此,我从DB中取出所有学生文档并存储在学生对象中。 3.用户可以使用提供的文本框过滤搜索,并可以选择特定的学生并删除它。
请找到以下用户界面:
HTML页面如下:
git rebase -i patch
##and skip all commits until m4 (included)
与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>
哪个inturn调用节点控制器:
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.";
});
}
});
在控制器内部,有一个学生模型的对象,在其中进行数据库通信。我使用mongodb.ObjectID.createFromHexString()方法从我从DB获得的_id值创建objectID
删除文档的学生型号代码:
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);
}
});
});
但是它给出了错误&#34;错误:传入的参数必须是12个字节的单个字符串或24个十六进制字符的字符串&#34;。所以我试着记录我从DB学生文档中获得的_id值及其长度。令人惊讶的是,我得到的长度为&#39; 25&#39;
请找到以下控制台:
_id:576aba09090560f80bd2caaa 长度----→25
关于这个问题的任何想法?请帮忙.....
答案 0 :(得分:2)
您的Angular代码正在设置端点,如下所示:
"/students/remove:"+$scope.studentRadio
我认为你希望:
在那里,所以URL看起来像这样:
/students/remove:576c1d4781aaa4f16a68af24
您的Express路线如下所示:
router.delete("/remove:studId", ...)
:
是Express路线中的特殊字符(它声明named parameter称为studId
)。这意味着您的路线会将/remove
之后的所有内容视为studId
的值,包括网址中的冒号。因此req.params.studId
为:576c1d4781aaa4f16a68af24
,其长度为25个字符。
如果你想使用这种URL方案,你需要通过转义使冒号成为匹配的一部分(所以它失去了它的特殊含义):
router.delete("/remove\\::studId", ...)