通过 mongodb 中的 _id 删除不起作用
remove by _id in mongodb doesn't work
我最初认为创建一个删除函数来与我的 mongodb 一起使用会非常简单,但我无法让它工作并且无法在 [=88= 上找到解决方案] 或者。
我正在使用 MEAN 堆栈创建一个应用程序,该堆栈使用用户和课程,并使用示例来完成用户处理部分,以便删除功能适用于用户。当我试图复制它以便课程也有一个时,我无法让它工作。
已附上我用于创建服务的所有(相关)代码。其中一些可能不是解决问题所必需的,并且与信息在应用程序中的传达方式更相关。让我知道是否需要其他任何东西。
客户端代码
admin/index.控制器
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){
});
}
app-services/course.服务
function Delete(_id) {
return $http.delete('/api/courses/' + _id).then(handleSuccess, handleError);
}
服务器端代码
server.js
app.use('/api/courses', require('./controllers/api/courses.controller.js'));
我认为错误要么在以下文件中,要么在 services/course.service.js 中,后者显示得更靠后一点。
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);
});
}
services/course.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');
//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(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;
}
编辑 一直在尝试 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
现在在查询中使用删除
db.collection('courses').remove(query, function(err, result){
//
})
我解决了,错误来自courses.controller.js
中的以下行
var courseID = req.user.sub;
愚蠢的错误,它将 courseID 设置为当前用户的 ID,因此它试图删除 ID 不存在的课程。
解决方案如下所示:
courses.controller.js
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);
});
}
services/course.service.js
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;
}
我最初认为创建一个删除函数来与我的 mongodb 一起使用会非常简单,但我无法让它工作并且无法在 [=88= 上找到解决方案] 或者。
我正在使用 MEAN 堆栈创建一个应用程序,该堆栈使用用户和课程,并使用示例来完成用户处理部分,以便删除功能适用于用户。当我试图复制它以便课程也有一个时,我无法让它工作。
已附上我用于创建服务的所有(相关)代码。其中一些可能不是解决问题所必需的,并且与信息在应用程序中的传达方式更相关。让我知道是否需要其他任何东西。
客户端代码
admin/index.控制器
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){
});
}
app-services/course.服务
function Delete(_id) {
return $http.delete('/api/courses/' + _id).then(handleSuccess, handleError);
}
服务器端代码
server.js
app.use('/api/courses', require('./controllers/api/courses.controller.js'));
我认为错误要么在以下文件中,要么在 services/course.service.js 中,后者显示得更靠后一点。
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);
});
}
services/course.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');
//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(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;
}
编辑 一直在尝试 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
现在在查询中使用删除
db.collection('courses').remove(query, function(err, result){
//
})
我解决了,错误来自courses.controller.js
中的以下行var courseID = req.user.sub;
愚蠢的错误,它将 courseID 设置为当前用户的 ID,因此它试图删除 ID 不存在的课程。
解决方案如下所示:
courses.controller.js
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);
});
}
services/course.service.js
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;
}