我是nodejs express et al的新手。我正在尝试理解为什么res.redirect需要GET才能工作......而resrerender并不是这样。这是场景。我有一个使用护照进行身份验证的登录。到目前为止。根据用户的类型进行身份验证后....用户被发送到特定的html页面。如果我只是res.render页面它工作正常....但如果我res.redirect到页面我得到一个"无法获取......"错误表明我没有得到(' / 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);
答案 0 :(得分:1)
在用户访问/login?Category=dealer
后,他/她的浏览器将为302到/users/dealers?name=a&email=b
。
然后您的服务器需要路由器router.get('/dealers', fn)
来显示该页面。最重要的是,用户的浏览器网址为/users/dealers?name=a&email=b
。
如果您在身份验证回调中直接使用res.render
,则用户的浏览器将显示已呈现的网页,但网址仍为/login?Category=dealer
。
建议在您的情况下使用重定向。否则,如果用户按“F5”刷新页面,他/她实际上是刷新URL /login?Category=dealer
,这将不必要地触发您的身份验证路由器和逻辑。
更新:
与渲染和重定向的区别,(抱歉,我回复的很晚,由于长城,这些天我无法访问stackoverflow)
<强> 1 强>
用户的浏览器向您的服务器发出http请求===&gt;
您的服务器获取请求,并使用res.render输出响应,表示您的服务器在响应标头中返回“http status 200”,在响应正文中返回“html”==&gt;
用户的浏览器获得'200和html'响应,然后解析'html'进行查看。
<强> 2 强>
用户的浏览器向您的服务器发出http请求===&gt;
您的服务器获取请求,并使用res.redirect,表示您的服务器在响应标头中返回“http状态302和新网址”,但未返回任何响应。==&gt;
用户的浏览器获得'302和新网址'响应,然后重新定位到新网址,这意味着用户的浏览器再次使用这个新网址==&gt;
来再次查询http请求您的服务器获取请求,并使用res.render输出响应,表示您的服务器在响应标头中返回“http status 200”,在响应正文中返回“html”==&gt;
用户的浏览器获得'200和html'响应,然后解析'html'进行查看。