试图理解html GET和res.redirect如何在express中工作

时间:2016-11-18 01:14:33

标签: javascript html node.js express

我是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);

1 个答案:

答案 0 :(得分:1)

res.redirect就像web服务器接受requrest后的东西,它在桌面后面强制浏览器更改url,这意味着302 http代码。 虽然res.render是web服务器,但只需使用jade或ejs来呈现页面,这意味着200个http代码。

在用户访问/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'进行查看。