web-dev-qa-db-ja.com

Expressを使用したNode.js:POSTリクエストをリダイレクトする方法

次のように、ある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');
});

しかし、POSTリクエストであるため、 '/ test'ページにリダイレクトできません。
では、POST '/ test'リクエストを保持したままリダイレクトを機能させるにはどうすればよいですか?

19
neolicd

あなたはこれを行うことができます:

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

Sendメソッドが保持されます。

参考までに、307 httpコード仕様は次のとおりです。

307一時的なリダイレクト(HTTP/1.1以降)この場合、リクエストは別のURIで繰り返される必要がありますが、今後のリクエストでは引き続き元のURIを使用できます。2 。たとえば、POSTリクエストは別のPOSTリクエストを使用して繰り返す必要があります。

詳細については、以下を参照してください: http://www.alanflavell.org.uk/www/post-redirect.html

33
ldg

ミドルウェアアーキテクチャに留意してください。各ハンドラーはコンテキストを操作し、next()を呼び出して応答するか、呼び出します。

この前提により、エクスプレスルーターは基本的に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
)
2

307と302の唯一の違いは、リダイレクトされた要求が行われたときにメソッドと本体が変更されないことを307が保証することです。

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

0
pshx