2016-08-07 17 views
5

tôi muốn chuyển hướng từ một yêu cầu URL tới một yêu cầu khác 'POST', như thế này:
Node.js với Express: làm thế nào để chuyển hướng một yêu cầu 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'); 
 
});

Tuy nhiên, tôi không thể chuyển hướng đến trang '/ test' vì nó là một yêu cầu POST.
Vì vậy, tôi nên làm gì để chuyển hướng hoạt động, giữ POST yêu cầu '/ test'?

+0

tôi có một chút nhầm lẫn bởi thuật ngữ 'trang' là bạn đang tìm kiếm chuyển hướng từ điểm đầu cuối này đến điểm cuối khác? Ví dụ '/' {GET} yêu cầu đến '/ test' {POST} –

+0

xin lỗi vì sự nhầm lẫn. ý tôi là chuyển hướng từ 'localhost: 3000 /' sang 'localhost: 3000/test' – neolicd

Trả lời

14

Bạn có thể làm điều này:

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

Mà sẽ giữ gìn send phương pháp.

Để tham khảo, mã 307 http spec là:

307 Temporary Redirect (kể từ HTTP/1.1) Trong dịp này, yêu cầu nên được lặp lại với một URI, nhưng yêu cầu trong tương lai vẫn có thể sử dụng URI gốc Ngược lại với 303, phương thức yêu cầu không được được thay đổi khi yêu cầu lại bản gốc. Ví dụ: yêu cầu POST phải được lặp lại bằng cách sử dụng yêu cầu POST khác.

Mọi chi tiết, xem: http://www.alanflavell.org.uk/www/post-redirect.html

+0

. Vì vậy, tôi chỉ không thể chuyển hướng đến app.post ('/ test') nếu tôi sử dụng app.get ('/'), phải không? – neolicd

+0

Không có chuyển hướng http tiêu chuẩn, bạn cần thiết lập một số loại proxy. – ldg

+1

Giải pháp này buộc một yêu cầu trình duyệt khác. Máy chủ chỉ thị trình duyệt, trình duyệt sau đó thực hiện một yêu cầu khác. Đây là một phương pháp bùng binh. Dù sao tôi có thể chuyển hướng trong Express trực tiếp để tránh phải đi tất cả các cách để trình duyệt để thực hiện một yêu cầu? – Koder

0

Hãy ghi nhớ những kiến ​​trúc middleware: Mỗi handler có thể thao tác các bối cảnh, và một trong hai phản ứng - hay - gọi next().

Bằng tiền đề này, bộ định tuyến nhanh về cơ bản là một chức năng phần mềm trung gian mà bạn có thể sử dụng sau khi "sửa" url.

(BTW, ứng dụng yêu cầu cũng là một chức năng, mặc dù tôi không chắc chắn nếu tôi khuyên bạn nên đi lại quá sớm trong chuỗi)

Dưới đây là một ví dụ 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 
) 
Các vấn đề liên quan