2014-10-11 51 views
0

我是Node/Express的初学者。我试图做一个CRUD应用程序,但坚持更新和删除。我认为我的路由器代码有问题,但我不知道为什么。以下代码位于我的控制器中,一切正常,但PUTDELETE。它总是路由到GET。我试图使用next();,但它返回此错误:Can't set headers after they are sent.PUT和DELETE总是通过Node + Express路由到GET

我可以使用GET /:company_id/delete进行删除工作,但这不是一个好的标准化解决方案。我如何获得更新和删除过程?

'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'); 
     } 

    }); 

    }); 

}; 
+0

你可以发布你要发送的请求的标题吗? – n0mercy 2014-10-11 22:02:53

+0

这是来自'DELETE'的请求。我把'DELETE'方法放在它的表单中,但仍然路由到'GET'。 '127.0.0.1 - - [Sat,11 Oct 2014 22:07:58 GMT]“GET/companies/5439a1316ed75300007010b7?_csrf = xWMPPDBp9W%2B1meXWKqM3QSgWGRCXs4HeUuMZE%3D HTTP/1.1”200 7044“http:// localhost:8000 /公司“”Mozilla/5.0(Macintosh;英特尔Mac OS X 10_9_4)AppleWebKit/537.36(KHTML,如Gecko)Chrome/37.0.2062.124 Safari/537.36“' – shankshera 2014-10-11 22:10:26

+0

问题出在您的客户端请求中。你的javascript看起来如何? – n0mercy 2014-10-11 22:13:49

回答

2

HTML表单仅支持GETPOST。然而,XMLHTTPRequest支持PUTDELETE,因此您可能必须使用此路线或使用类似method-override的内容来允许使用其他HTTP动词提交HTML表单。

+0

我正在关注krakenjs示例,并尝试在隐藏输入中添加'_method'。我忘了检查'package.json'是否有额外的库。谢谢您的回答。 :) – shankshera 2014-10-11 22:29:55

相关问题