2016-08-07 4 views
5

Я хочу, чтобы перенаправить от одного запроса URL на другой запрос 'POST', как это:
Node.js с экспресс: как перенаправить запрос 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'); 
 
});

Однако я не может перенаправляться на страницу «/ test», потому что это запрос POST.
Итак, что мне нужно сделать, чтобы перенаправление работало, сохраняя запрос «/ test» POST?

+0

I я немного смущен термином «страница», вы смотрите на перенаправление с 1 конечной точки на другую? Пример '/' {GET} запроса '/ test' {POST} –

+0

извините за путаницу. я имею в виду перенаправление с «localhost: 3000 /» на «localhost: 3000/test» – neolicd

ответ

14

Вы можете сделать это:

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

Который сохранит метод отправки.

Для справки, 307 HTTP код спецификация:

307 Temporary Redirect (с HTTP/1.1) В этом случае, запрос следует повторить с другим URI, но будущие запросы по-прежнему могут использовать исходный URI.2 В отличие от 303, метод запроса не должен быть изменен при повторной выдаче первоначального запроса . Например, запрос POST должен быть повторен с использованием другого запроса POST.

Для получения дополнительной информации см: http://www.alanflavell.org.uk/www/post-redirect.html

+0

. Поэтому я просто не могу перенаправить приложение app.post ('/ test'), если я использую app.get ('/'), правильно? – neolicd

+0

Не со стандартным перенаправлением http, вам нужно будет настроить какой-то прокси. – ldg

+1

Это решение заставляет использовать другой запрос браузера. Сервер указывает браузеру, затем браузер выполняет другой запрос. Это окольный метод. Во всяком случае, я могу перенаправить в Express прямо, чтобы не дойти до браузера, чтобы сделать запрос? – Koder

0

Имейте в виду архитектуру промежуточного слоя: Каждый обработчик может манипулировать контекстом, а также ответить - или - вызов next().

С помощью этого предположения экспресс-маршрутизатор в основном представляет собой функцию промежуточного программного обеспечения, которую вы можете использовать после «исправления» URL-адреса.

(кстати, приложение запрос является также функцией, хотя я не уверен, если я рекомендую идти назад, чтобы в начале цепи)

Вот kind'a пример:

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 
) 
Смежные вопросы