带参数的res.redirect('back')

时间:2012-09-15 21:27:55

标签: node.js redirect express

我的网站每个页面都有一个注册表。注册期间可能会出现一些错误。捕获错误后,我必须将用户返回到上一页,显示一些错误消息。问题是我不知道用户从哪个页面执行了注册,因此我使用了res.redirect('back');。但是,我不能只是重定向用户,我也要显示错误信息,所以我必须传递一些参数。但res.redirect('back', (reg_error:'username')})无法直接使用,因为res.redirect()不支持参数。如何使用某个参数渲染上一页?

7 个答案:

答案 0 :(得分:40)

使用referer标题查找用户来自哪个页面可能会有所帮助:

app.get('/mobileon', function(req, res){
  backURL=req.header('Referer') || '/';
  // do your thang
  res.redirect(backURL);
});

您可能还希望将backURL存储在req.session中,如果您需要将其存储在多个路径中。请记住测试该变量的存在,例如:res.redirect(req.session.backURL || '/')


编辑:由于我的答案得到了一些赞成,我打算采用当前的方式来做到这一点。它有点长,所以你可以在https://gist.github.com/therealplato/7997908查看它。

最重要的区别是在查询字符串中使用显式“bounce”参数来覆盖Referer url。

答案 1 :(得分:27)

实现这一点的一个非常简单的方法是使用connect-flash,一个用于express的中间件,利用Express中内置的会话中间件将“flash”消息传递给下一个请求。

这意味着您无需添加字段来跟踪您的视图的表单或路由模式的网址或消息。

它提供了same feature in Ruby on Rails的简单版本。

(显然你必须使用Express framework来使用它,但我也强烈建议你这样做!)

将其插入:

var flash = require('connect-flash');
var app = express();

app.configure(function() {
  app.use(express.cookieParser('keyboard cat'));
  app.use(express.session({ cookie: { maxAge: 60000 }}));
  app.use(flash());
});

然后像这样使用它:

app.get('/flash', function(req, res){
  req.flash('info', 'Flashed message')
  res.redirect('/');
});

app.get('/', function(req, res){
  res.render('index', { message: req.flash('info') });
});

答案 2 :(得分:5)

如果您正在使用会话,则可以在重定向之前将reg_error对象添加到req.session对象。然后,当您加载上一页时,它将在req.session对象上可用。

答案 3 :(得分:5)

您可以将其重定向为res.redirect('..?error=1')

?标记告诉浏览器它是一组可选参数,而..只是一个相对回忆的路径名(比如在终端上调用cd ..以移回一个目录) 并且您的浏览器将指向最后带有该标记的相应页面:http://.....?error=1

然后您可以通过执行以下操作简单地在相应页面上提取错误:

if (req.param("error" == 1)) { 
// do stuff bassed off that error match
};

您可以对几个不同的错误值进行硬编码,并根据发生的错误进行适当的响应

请注意,这会使您的网页易于操作,因为用户可以输入自己的参数并让您的网页对其进行响应,因此请确保您所采取的操作不是您不希望人们滥用的操作。 (对于简单的错误显示应该没问题)

答案 4 :(得分:0)

您可以使用connect-flash软件包发送错误或成功消息。

https://www.npmjs.com/package/connect-flash

答案 5 :(得分:0)

在处理请求之前使用中间件,并在res对象中放置成功和错误变量。

在下面参考:-

// set local variables middleware
    app.use(function(req, res, next) {
         res.locals.currentUser = req.user;
           // set success flash message
           res.locals.success = req.session.success || '';
              delete req.session.success;
               // set error flash message
               res.locals.error = req.session.error || '';
            delete req.session.error;
           // continue on to next function in middleware chain
              next();
             });

遇到错误时,请使用其他中间件来处理错误,并使用req对象添加错误。

app.use(function(err, req, res, next) {

       console.log(err);
       req.session.error = err.message;
            res.redirect('back');
       });

这将重定向到上一页以及res对象中的错误消息

答案 6 :(得分:-17)

您应该将页面参数添加到表单中。 然后,您可以在服务器上阅读它并将其用于重定向。

res.redirect(page, {reg_error:'username'}) // page being the url to redirect to.