简体   繁体   中英

PUT and DELETE always route to GET in Node + Express

I'm a beginner in Node/Express. I tried to make an CRUD application but stuck at update and delete. I think my router code is problematic but I don't know why. The following code is in my controller, everything works but PUT and DELETE . It always route to GET . I tried to use next(); but it returns this error: Can't set headers after they are sent. .

I can make the delete works by using GET /:company_id/delete but it's not a good and standardized solution. How can I get update and delete process worked?

'use strict';

var Companies = require('../../models/companies');

module.exports = function (router) {

  // INDEX
  // accessed at GET http://localhost:8000/companies
  router.get('/', function (req, res) {

    Companies.find(function(err, model) {

      if (err) {
        res.send(err);
      }
      else {
        res.format({
          json: function () {
            res.json(model);
          },
          html: function () {
            res.render('companies/index', model);
          }
        });
      }

    });

  });

  // CREATE VIEW
  // accessed at GET http://localhost:8000/companies/create
  router.get('/create', function (req, res) {

      res.render('companies/create');

  });

  // CREATE DATA
  // accessed at POST http://localhost:8000/companies
  router.post('/', function (req, res) {

    var name = req.body.name && req.body.name.trim();
    var type = req.body.type && req.body.type.trim();

    // VALIDATION
    if (name === '') {
      res.redirect('/companies/create');
      return;
    }

    var model = new Companies({name: name, type: type});

    model.save(function(err) {
      if (err) {
        res.send(err);
      }
      else {
        res.redirect('/companies');
      }
    });

  });

  // READ
  // accessed at GET http://localhost:8000/companies/:company_id
  router.get('/:company_id', function(req, res) {

    Companies.findById(req.params.company_id, function(err, model) {

      if (err) {
        res.send(err);
      }
      else {
        res.render('companies/read', model);
      }

    });

  });

  // UPDATE VIEW
  // accessed at GET http://localhost:8000/companies/:company_id/edit
  router.get('/:company_id/edit', function(req, res) {

    Companies.findById(req.params.company_id, function(err, model) {

      if (err) {
        res.send(err);
      }
      else {
        res.render('companies/edit', model);
      }

    });

  });

  // UPDATE DATA
  // accessed at PUT http://localhost:8000/companies/:company_id
  router.put('/:company_id', function(req, res) {

    Companies.findById(req.params.company_id, function(err, model) {

      if (err) {
        res.send(err);
      }
      else {
        model.name = req.body.name;
        model.type = req.body.type;

        model.save(function(err) {
          if (err) {
            res.send(err);
          }
          else {
            res.redirect('/companies');
          }
        });

      }
    });

  });

  // DELETE
  // accessed at DELETE http://localhost:8000/companies/:company_id
  router.delete('/:company_id', function (req, res) {

    Companies.remove({ _id: req.params.company_id }, function(err) {

      if (err) {
        res.send(err);
      }
      else {
        res.redirect('/companies');
      }

    });

  });

};

HTML forms only support GET and POST . XMLHTTPRequest supports PUT and DELETE however, so you may have to go that route OR use something like method-override to allow HTML forms to submit using other HTTP verbs.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM