通过 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 的安全方法是啥?

如何通过 Node + Express + Mongoose 中的单选按钮传递布尔值?

使用 Nodejs、Express、Mongoose 和 React 将图像上传到 MongoDB