通过 express、mongoose 和 angular 删除 mongo 文档时出现 404
Posted
技术标签:
【中文标题】通过 express、mongoose 和 angular 删除 mongo 文档时出现 404【英文标题】:404 when deleting a mongo document via express, mongoose, and angular 【发布时间】:2017-01-26 11:56:46 【问题描述】:我是使用 MEAN 堆栈的新手,已经学习了一些使用 mongoose、express 和 ui-router 将数据添加到 mongodb 的基础知识。但是,我不知道如何删除文档。每当我尝试时,我都会收到 404 错误,即使看起来链接应该是正确的。有人可以帮忙吗?客气点,我的代码可能有问题...
这是我的角度文件:
var app = angular.module('updateTracker', ['ui.router']);
app.factory('courses', ['$http', function($http)
var o =
courses: []
;
o.getAll = function()
return $http.get('/courses').success(function(data)
angular.copy(data, o.courses);
);
;
o.create = function(course)
return $http.post('/courses', course).success(function(data)
o.courses.push(data);
);
;
o.get = function(id)
return $http.get('/courses/' + id).then(function(res)
return res.data;
);
;
o.addEntry = function(id, entry)
return $http.post('/courses/' + id + '/entries', entry);
;
o.changeLesson = function(course)
return $http.put('/courses/' + course._id + '/changeLesson')
.success(function(data)
course.lesson = "New Lesson";
);
;
o.removeCourse = function(course)
return $http.delete('/courses/' + course._id + '/removeCourse')
.success(function (data, status)
console.log(data);
);
;
return o;
]);
app.controller('MainCtrl', [
'$scope',
'courses',
function($scope, courses)
$scope.courses = courses.courses;
$scope.addCourse = function()
if(!$scope.lesson || $scope.lesson === '') return;
courses.create(
lesson: $scope.lesson,
course: $scope.course,
curriculum: $scope.curriculum
);
$scope.lesson = '';
$scope.course = '';
$scope.curriculum = '';
;
$scope.changeLesson = function(course)
courses.changeLesson(course);
;
$scope.removeCourse = function(course)
courses.removeCourse(course);
;
]);
app.controller('CoursesCtrl', [
'$scope',
'courses',
'course',
function($scope, courses, course)
$scope.course = course;
$scope.addEntry = function()
// if($scope.version === '') return;
courses.addEntry(course._id,
version: $scope.version,
notes: $scope.notes,
statusCode: $scope.statusCode,
statusMessage: $scope.statusMessage,
author: 'user'
).success(function(entry)
$scope.course.entries.push(entry);
);
$scope.version = '';
$scope.notes = '';
$scope.statusCode = '';
$scope.statusMessage = '';
;
]);
app.config([
'$stateProvider',
'$urlRouterProvider',
function($stateProvider, $urlRouterProvider)
$stateProvider
.state('home',
url: '/home',
templateUrl: '/home.html',
controller: 'MainCtrl',
resolve:
postPromise: ['courses', function(courses)
return courses.getAll();
]
)
.state('courses',
url: '/courses/id',
templateUrl: '/courses.html',
controller: 'CoursesCtrl',
resolve:
course: ['$stateParams', 'courses', function($stateParams, courses)
return courses.get($stateParams.id);
]
);
$urlRouterProvider.otherwise('home')
]);
我的路线:
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var Course = mongoose.model('Course');
var Entry = mongoose.model('Entry');
/* GET home page. */
router.get('/', function(req, res, next)
res.render('index', title: 'Express' );
);
module.exports = router;
router.get('/courses', function(req, res, next)
Course.find(function(err, courses)
if(err) return next(err);
res.json(courses);
);
);
router.post('/courses', function(req, res, next)
var course = new Course(req.body);
course.save(function(err, course)
if(err)return next(err);
res.json(course);
);
);
router.param('course', function(req, res, next, id)
var query = Course.findById(id);
query.exec(function (err, course)
if (err) return next(err);
if (!course) return next(new Error('can\'t find course'));
req.course = course;
return next();
);
);
router.get('/courses/:course', function(req, res, next)
req.course.populate('entries', function(err, course)
if (err) return next(err);
res.json(course);
);
);
router.post('/courses/:course/entries', function(req, res, next)
var entry = new Entry(req.body);
entry.course = req.course;
entry.save(function(err, entry)
if(err) return next(err);
req.course.entries.push(entry);
req.course.save(function(err, course)
if(err) return next(err);
res.json(entry);
);
);
);
router.put('/courses/:course/changeLesson', function(req, res, next)
req.course.changeLesson(function(err, course)
if (err) return next(err);
res.json(course);
);
);
router.delete('courses/:course', function(req, res)
Course.remove(
_id : mongodb.ObjectID(req.params.course)
, function(err)
if(err) res.send(err);
console.log("remove id");
)
);
router.param('entry', function(req, res, next, id)
var query = Entry.findById(id);
query.exec(function (err, entry)
if (err) return next(err);
if (!entry) return next(new Error('can\'t find entry'));
req.entry = entry;
return next();
);
);
和我的课程架构:
var mongoose = require('mongoose');
var CourseSchema = new mongoose.Schema(
lesson: String,
course: String,
curriculum: String,
entries: [ type: mongoose.Schema.Types.ObjectId, ref: 'Entry']
);
CourseSchema.methods.changeLesson = function(cb)
this.lesson = "Update Lesson";
this.save(cb);
;
mongoose.model('Course', CourseSchema);
【问题讨论】:
【参考方案1】:您忘记在router.delete
和/removeCourse
的开头添加/
,并且没有使用 res.send 或 res.json 或 res.end 等返回值。这应该是如下
router.delete('/courses/:course/removeCourse', function(req, res)
Course.remove(
_id : req.params.course
, function(err)
if(err)
console.log(err);
res.status(500).send(err);
else
res.json();
console.log("remove id");
)
);
【讨论】:
感谢您的帮助 - 它似乎修复了 404 错误,但我没有收到 500 错误。我感到无助,但我不知道从这里去哪里。任何帮助将不胜感激! 您在删除课程时遇到错误。您需要调试和修复。我已经更新了代码和if(err) console.log(err);
。你可以检查错误或让我抛出什么错误
嗯-这是我遇到问题的部分-它没有记录错误-即:我认为它没有进入 router.delete 功能,否则我会看到控制台.log(错误)。我什至没有在我的角度文件中获取我的日志 - 当我运行 o.delete (见上文)时,我看到一个运行该函数的日志,但在 .success 之后它不打印日志。
我在我的 Angular 工厂中添加了一个错误处理程序,错误提示“未定义 mongo” - 如果我的其他功能正常工作,为什么会出现这种情况?
您需要删除mongodb.ObjectID(req.params.course)
并使用req.params.course
,因为您没有定义mongodb
。我更新了代码,请看一下以上是关于通过 express、mongoose 和 angular 删除 mongo 文档时出现 404的主要内容,如果未能解决你的问题,请参考以下文章
Node.js /Express 和 mongoose:通过自动拉取新数据建立“可观察”的 mongodb 连接?
我正在学习 express 和 mongoose,我无法保存要保存的模式,但可以通过 console.log() 看到它
我正在学习 express 和 mongoose,我无法保存要保存的模式,但可以通过 console.log() 看到它
将数据从 Node 和 Express 中的查询存储到 AngularJS 的安全方法是啥?