MongoDB _id长度为25

时间:2016-06-23 15:12:03

标签: angularjs node.js mongodb

我正在尝试使用nodeJS从MongoDB中删除文档。

我的代码流程如下: 1.用户可以删除特定学生。 因此,我从DB中取出所有学生文档并存储在学生对象中。 3.用户可以使用提供的文本框过滤搜索,并可以选择特定的学生并删除它。

请找到以下用户界面:

UI

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

关于这个问题的任何想法?请帮忙.....

1 个答案:

答案 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", ...)