[英]trying to understand how html GET and res.redirect works in express
我是nodejs express等人的新手。我试图了解为什么res.redirect需要GET才能工作。而res.render却不需要。 这是场景。 到目前为止,我有一个使用护照进行身份验证的登录名。 身份验证后,取决于用户的类型...。用户将被发送到特定的html页面。 如果我只是重新渲染页面,它就可以正常工作....但是,如果我重新重定向到页面,则会收到“无法获取...”错误,表明我没有get('/ page')块。 这是一个示例代码:
// get part request page
router.get('/partpage', function(req,res) {
res.render('partpage', {name: user.get("Name"),email:user.get("Email")});
});
// get dealer page
router.get('/dealers', function(req,res) {
res.render('dealers', {name: user.get("Name"),email:user.get("Email")});
});
.
.
.
router.post('/login',
passport.authenticate( 'local',
{sucessRedirect:'/',
failureRedirect:'/users/login',
failureFlash:true}),
function(req,res)
{
.
.
.
// After passport authentication.....
if (user.get("Category")==="dealer")
{
res.redirect('/users/dealers?name='+username+'&email='+useremail);
}
else
{
res.redirect('/users/partpage?name='+username+'&email='+useremail);
}
如果删除任何一个GET,我都会收到并报错(“无法获取...”)。 我不明白为什么会这样。 更重要的是,我正在将参数传递给页面...哪一个优先? ...显然这里有问题! 谁能为我解释一下? 正确的方法是什么?
主页路由设置如下:
在app.js中
.
.
.
var routes = require('./routes/index');
.
.
.
app.set('views', path.join(__dirname,'views'));
app.set('view options', { layout:'layout.ejs' });
app.set('view engine','ejs');
.
.
.
app.use('/', routes);
res.redirect就像Web服务器接受requrest之后的东西一样,它在表后面迫使浏览器更改url,这意味着302 http代码。 当res.render是Web服务器时,仅使用jade或ejs来渲染页面,这意味着200个http代码。
对于您而言,在用户访问/login?Category=dealer
,他/她的浏览器将是/users/dealers?name=a&email=b
302。 然后,您的服务器需要路由器router.get('/dealers', fn)
来显示页面。 最重要的是,用户的浏览器网址将是/users/dealers?name=a&email=b
。
如果您直接在身份验证回调中使用res.render
,则用户的浏览器将显示渲染的页面,但url仍然是/login?Category=dealer
。
建议在您的情况下使用重定向。 否则,如果用户按“ F5”刷新页面,则他/她实际上是刷新URL /login?Category=dealer
,这将不必要地触发您的身份验证路由器和逻辑。
更新:
渲染和重定向的区别,(抱歉,我回复晚,由于长城,这些天我无法访问stackoverflow)
1个
用户的浏览器向您的服务器发出http请求===>
您的服务器获取请求,并使用res.render输出响应,这意味着您的服务器在响应标头中返回“ http status 200”,在响应正文中返回“ html” ==>
用户的浏览器收到“ 200 and html”响应,然后解析“ html”进行查看。
2
用户的浏览器向您的服务器发出http请求===>
您的服务器获取请求,并使用res.redirect,这意味着您的服务器在响应标头中返回了“ http状态302和新url”,但未返回任何响应。==>
用户的浏览器收到“ 302和新的url”响应,然后重新定位到新的url,这意味着用户的浏览器再次使用此新的url ius http请求==>
您的服务器获取请求,并使用res.render输出响应,这意味着您的服务器在响应标头中返回“ http status 200”,在响应正文中返回“ html” ==>
用户的浏览器收到“ 200 and html”响应,然后解析“ html”进行查看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.