Javascript 通过mongodb中的"u id"删除';行不通

Javascript 通过mongodb中的"u id"删除';行不通,javascript,angularjs,node.js,mongodb,mean,Javascript,Angularjs,Node.js,Mongodb,Mean,我原本以为创建一个删除函数来与我的mongodb一起使用会非常简单,但我无法让它工作,也无法在google上找到解决方案 我正在使用MEAN stack创建一个应用程序,该应用程序使用用户和课程,并使用了一个示例来完成用户处理部分,因此删除函数适用于用户。当我试图复制它,以便课程也有一个,我无法让它工作 已附上我用于创建服务的所有(相关)代码。其中一些可能不需要解决问题,而更多地与应用程序内的信息沟通方式有关。如果还需要什么,请告诉我 客户端代码 function Delete(_id) {

我原本以为创建一个删除函数来与我的mongodb一起使用会非常简单,但我无法让它工作,也无法在google上找到解决方案

我正在使用MEAN stack创建一个应用程序,该应用程序使用用户和课程,并使用了一个示例来完成用户处理部分,因此删除函数适用于用户。当我试图复制它,以便课程也有一个,我无法让它工作

已附上我用于创建服务的所有(相关)代码。其中一些可能不需要解决问题,而更多地与应用程序内的信息沟通方式有关。如果还需要什么,请告诉我

客户端代码

function Delete(_id) {
    return $http.delete('/api/courses/' + _id).then(handleSuccess, handleError);
    }
// function(err) has been pretty much the same as for the delete function above for all tries. 

db.collection('courses').remove({"_id": ObjectID(_id)}, function(err)...)

db.courses.remove({"_id": "ObjectId"(_id)}, function (err)... )

db.courses.remove({"_id": "$oid":(_id)}, function(err)... )

same as above but without " " around _id, ObjectID and $oid
管理员/索引控制器

 function deleteCourse() {
    // CourseService calls app-services/course.service to enable 
   // all sub-pages to call all course-functions. 
    CourseService.Delete(event.target.id)
        .then(function(){
             initController();
            })
        .catch(function(error){
            });

    }
应用程序服务/课程服务

function Delete(_id) {
    return $http.delete('/api/courses/' + _id).then(handleSuccess, handleError);
    }
// function(err) has been pretty much the same as for the delete function above for all tries. 

db.collection('courses').remove({"_id": ObjectID(_id)}, function(err)...)

db.courses.remove({"_id": "ObjectId"(_id)}, function (err)... )

db.courses.remove({"_id": "$oid":(_id)}, function(err)... )

same as above but without " " around _id, ObjectID and $oid
服务器端代码

function Delete(_id) {
    return $http.delete('/api/courses/' + _id).then(handleSuccess, handleError);
    }
// function(err) has been pretty much the same as for the delete function above for all tries. 

db.collection('courses').remove({"_id": ObjectID(_id)}, function(err)...)

db.courses.remove({"_id": "ObjectId"(_id)}, function (err)... )

db.courses.remove({"_id": "$oid":(_id)}, function(err)... )

same as above but without " " around _id, ObjectID and $oid
server.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         
我认为错误要么出现在下面的文件中,要么出现在services/course.service.js中,该文件显示得更靠后一点

courses.controller.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         
services/course.service.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         
我在上面的删除功能中尝试的示例

function Delete(_id) {
    return $http.delete('/api/courses/' + _id).then(handleSuccess, handleError);
    }
// function(err) has been pretty much the same as for the delete function above for all tries. 

db.collection('courses').remove({"_id": ObjectID(_id)}, function(err)...)

db.courses.remove({"_id": "ObjectId"(_id)}, function (err)... )

db.courses.remove({"_id": "$oid":(_id)}, function(err)... )

same as above but without " " around _id, ObjectID and $oid
删除services/user.service.js中用户的功能以进行比较

var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connects to the database with diffrent connectionstring based on if you connect localy or in openshift
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('users');

var service = {};
service.delete = _delete;
module.exports = service;

//Deletes the user form the database based on ID.
function _delete(_id) {
    var deferred = Q.defer();

    db.users.remove(
        { _id: mongo.helper.toObjectID(_id) },
       function (err) {
            if (err) deferred.reject(err);
            deferred.resolve();
        });
    return deferred.promise;
}
EDIT一直在尝试Sundar和anwerjunaid的建议,并决定使用一些console.log来尝试了解发生了什么

下面是我尝试过的一个例子和我得到的日志

db.courses.remove(
        { "_id": _id},
        function (err) {
            if (err) deferred.reject(err);
            deferred.resolve();
            console.log('inside')
            console.log(deferred);
        });
   console.log('outside')
   console.log(deferred)
   return deferred.promise;


outside
defer {
    promise: { state: 'pending' },
    resolve: [Function],
    fulfill: [Function],
    reject: [Function],
    notify: [Function] }
inside
defer {
  promise: { state: 'fulfilled', value: undefined },
  resolve: [Function],
  fulfill: [Function],
  reject: [Function],
  notify: [Function] }

这是否意味着它在db.courses.remove完成之前执行return.deferred.promise?这可能是导致错误的原因吗

您也可以尝试使用ObjectId类型:

var ObjectId = require('mongoose').Types.ObjectId;
var query = { _id: new ObjectId(id) }; // Pass string Id here
现在将remove here与query一起使用

db.collection('courses').remove(query, function(err, result){
     //
})

您也可以尝试使用ObjectId类型:

var ObjectId = require('mongoose').Types.ObjectId;
var query = { _id: new ObjectId(id) }; // Pass string Id here
现在将remove here与query一起使用

db.collection('courses').remove(query, function(err, result){
     //
})

我解决了它,错误来自courses.controller.js中的以下行

var courseID = req.user.sub;
愚蠢的错误,它将courseID设置为当前用户的ID,因此试图删除ID不存在的课程

解决方案如下所示:

courses.controller.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         
services/course.service.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         

我解决了它,错误来自courses.controller.js中的以下行

var courseID = req.user.sub;
愚蠢的错误,它将courseID设置为当前用户的ID,因此试图删除ID不存在的课程

解决方案如下所示:

courses.controller.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         
services/course.service.js

app.use('/api/courses', require('./controllers/api/courses.controller.js'));
var config = require('config.json');
var express = require('express');
var router = express.Router();
var CourseService = require('services/course.service');

router.delete('/:_id', deleteCourse);

module.exports = router;


function deleteCourse(req,res) {
//Do not now why req.user.sub works ( it passes on the ID). 
//Copied it from the corresponding function for User with the intention to change it to req.course.sub but that didn't work. 
//Somehow req.user.sub did to let it stay. Might cause the error? 

var courseID = req.user.sub;
CourseService.delete(courseID)
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function (err) {
       res.status(400).send(err);
   });
}
var config = require('config.json');
var _ = require('lodash');
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });

db.bind('courses');

var service = {};
service.delete = _delete;
module.exports = service;

// this is where I think the error occurs. this is the current version of it,       will include examples of what i've tried earlier below. Current version corresponds with the function for deleting users. 

function _delete(_id){
    var deferred = Q.defer();
    db.courses.remove(
        { _id: mongo.helper.toObjectID(_id) },
        function (err) {
            if (err) deferred.reject(err);

            deferred.resolve();
        });
    return deferred.promise;
}
function deleteCourse(req,res) {
    var courseID = req.params._id;

   CourseService.delete(courseID)
       .then(function(){
           res.sendStatus(200);
       })
       .catch(function (err) {
           res.status(400).send(err);
       });
}
function _delete(_id) {                                   
    var deferred = Q.defer();                             

    db.courses.remove(                                    
        { _id: mongo.helper.toObjectID(_id) },            
        function (err) {                                  
            if (err) deferred.reject(err);                                                          
            deferred.resolve();                           
        });                                               
    return deferred.promise;                              
}                                                         

remove({“\u id”:“(\u id)”},函数(err)。在对象的值部分,替换id字符串不起作用…:(@sundarcan u在这里发布您尝试过的实际代码?。同时从关键部分@sundar db.courses.remove({“\u id”:“(\u id)”},函数(err){if(err)deferred.reject(err);deferred.resolve();});尝试此db.courses.remove({“id”:},函数(err)…)db.courses.remove({“\u id”:“(\u id)”},函数(错误)…)尝试此操作。在对象的值部分替换id字符串不起作用…:(@sundarcan u在此处发布您尝试的实际代码?。同时从关键部分@sundar db.courses.remove({“\u id”:“(\u id)”},函数(err){if(err)deferred.reject(err);deferred.resolve()});尝试此db.courses.remove({“id”:id},函数(err).)我不确定应该如何使用.exec(),我应该将它与db.courses一起使用吗?像db.courses.remove(query.exec()?谢谢,尽管它不起作用:TypeError:db.collection(…).remove(…).exec不是一个函数,现在尝试解决它意味着可以直接将回调作为remove方法中的第二个参数传递。修复了它,现在它没有错误,但它仍然没有被删除。@anwerjunaidI不确定我应该如何使用.exec(),我应该将它与db.courses一起使用吗?就像db.courses.remove(query.exec()一样)?谢谢,尽管它不起作用:TypeError:db.collection(…).remove(…).exec不是函数,现在尝试解决它意味着您可以直接将回调作为remove方法中的第二个参数传递。修复了它,现在它没有错误,但仍然没有删除。@anwerjunaid