Node.js with Express:如何重定向POST请求

neo*_*icd 21 redirect node.js express

我想从一个URL请求重定向到另一个'POST'请求,如下所示:

var app = require('express')();

app.get('/', function(req, res) {
  res.redirect('/test');
});

app.post('/test', function(req, res) {
  res.send('/test page');
});

app.listen(3000, function() {
  console.log('listenning on port:3000');
});
Run Code Online (Sandbox Code Playgroud)

但是,我无法重定向到'/ test'页面,因为它是一个POST请求.
那么我该怎么做才能使重定向工作,保持'/ test'请求POST?

ldg*_*ldg 35

你可以这样做:

app.post('/', function(req, res) {
  res.redirect(307, '/test');
});
Run Code Online (Sandbox Code Playgroud)

这将保留send方法.

作为参考,307 http代码规范是:

307临时重定向(自HTTP/1.1起)在这种情况下,请求应该使用另一个URI重复,但将来的请求仍然可以使用原始URI.2与303相比,重新发出原始请求时不应更改请求方法.例如,必须使用另一个POST请求重复POST请求.

有关详细信息,请参阅:http://www.alanflavell.org.uk/www/post-redirect.html

  • 该解决方案强制另一个浏览器请求。服务器指示浏览器,然后浏览器发出另一个请求。这是一种环形交叉路方法。无论如何,我可以直接在Express中重定向,以避免不得不一直浏览到浏览器发出请求? (2认同)

Rad*_*own 6

请记住中间件架构:每个处理程序都可以操纵上下文,或者响应或调用next()

在此前提下,express router 基本上是一个中间件功能,您可以在“更正” url 后使用。

(顺便说一句,请求应用程序也是一个功能,尽管我不确定我是否建议在链的早期返回)

这是一个例子:

const router = new require('express').Router()
const user = require('../model/user') 
//assume user implements:
//  user.byId(id) -> Promise<user>
//  user.byMail(email) -> Promise<user>

const reqUser = userPromise => (req, res, next) =>
   req.user
     ? next()
     : userPromise(req)
       .then(user => { req.user = user })
       .then(next, next)
//assume the sever that uses this router has a 
//standard (err, req, res, next) handler in the end of the chain...

const byId = reqUser( req => user.byId(req.params.id) )
const byMail = reqUser( req => user.byMail(req.params.mail) )

router.post('/by-id/:id/friends',
  byId,
  (req, res) => res.render('user-friends', req.user)
)

router.post('/by-email/:email/friends',
  byMail,
  (req, res, next) => {
     req.url = `/by-id/${req.user.id}/friends`
     next()
  }, 
  router
)
Run Code Online (Sandbox Code Playgroud)


psh*_*shx 5

307和302唯一的区别是307保证重定向请求时方法和主体不会改变。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307