一次处理来自多个路由的POST请求

时间:2018-11-18 23:13:04

标签: node.js forms express routing

我正在网站页脚(在footer.pug中)提交一个简单的联系表:

form(method="POST" action="contact_form")
  input(type='email' name='ct_email' data-name='ct_email' required)
  textarea(type='text' name='ct_message' data-name='ct_message' required)
  button(type='submit') Send

由于表单位于模板中,并且整个网站都使用页脚模板,因此可以通过多种途径提交表单:

  • /contact_form
  • /route1/contact_form
  • /route1/de/contact_form
  • 依此类推...

所以现在看来​​我必须为所有可能的路线创建一个处理程序:

router.post('/contact_form', function(req, res, next) {
  // ...
}

router.post('/route1/contact_form', function(req, res, next) {
  // ...
}

如何轻松处理来自的所有路由中的POST请求,而无需为每个路由编写处理程序

4 个答案:

答案 0 :(得分:1)

您可以在表单中使用绝对路径引用,即使表单位于不同的页面中,它也将始终提交到同一路径。

尝试一下

form(method="POST" action="/contact_form")

请注意,操作已从contact_form更改为/contact_form。添加/时,您开始将路径引用为域的绝对路径。因此,现在,所有页面的表单都将提交到http://your-domain/contact-form

答案 1 :(得分:1)

不能完全确定这是否是您的意思,但ExpressJS路由器的第一个参数(我想这就是router在这里所做的事情) 可以是数组。所以代替:

router.post('/contact_form', function(req, res, next) {
    // ...
}

router.post('/route1/contact_form', function(req, res, next) {
    // ...
}

您可以这样做:

router.post(['/contact_form','route1/contact_form'],function(req,res,next){
    //some fancy logic to handle both routes.
})

当然,这要求您保留这些可能路线的列表。另一方面,您可以遵循Dinesh Pandiyan的建议,而只需使用绝对路径即可。因此,您实际上不是在说page1.html,page2.html,page3.html等都拥有自己的路由器(或您的路由器阵列中的条目),而是说“转到域路由,然后转到此地址”。

答案 2 :(得分:0)

每个请求应在单独的函数中处理,因为每个请求都有自己的逻辑。但是如果你想

<div id="border-animation"><div>

目前,我没有办法测试此代码,但我认为这将对您有所帮助。

答案 3 :(得分:0)

这是另一个潜在的解决方案-使用独立的函数作为路由处理程序。

router.post('/a', handlePost);
router.post('/b', handlePost);
router.post('/c', handlePost);

function handlePost(req, res, next){
  // use req.path here to figure out what url was called 

}