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

f1n*_*1nn 42 redirect node.js express

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

Pla*_*ato 40

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

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

您可能还希望存储backURL在req.session中,如果您需要它可以在多个路径中保留.记得测试该变量的存在,例如:res.redirect(req.session.backURL || '/')


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

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

  • 但请注意,如果用户不配置它们,许多浏览器将不会发送"Referer"标头,并且许多用户实际上会在那里配置浏览器而不是(因为标头可以跨域发送,因此可以使用用户可能不赞同的目的). (2认同)
  • 是的.这就是为什么我没有建议引用标题.它在网站控制之外.浏览器可以发送它想要的任何内容或者根本不发送内容 (2认同)

Jed*_*son 27

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

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

在Ruby on Rails中提供了相同功能的简单版本.

(显然你必须使用Express框架才能使用它,但我也强烈建议你这样做!)

像这样插入:

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());
});
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

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') });
});
Run Code Online (Sandbox Code Playgroud)


dan*_*ugh 5

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


gad*_*adu 5

你可以简单地将其重定向为 res.redirect('..?error=1')

?标签告诉,这是一个可选参数集和浏览器..只是一个相对路径召回(比如调用cd ..终端上向后移动一个目录),你的浏览器将直接与该标签在年底适当的页面:http://.....?error=1

然后你可以通过执行以下操作简单地在适当的页面上拉出错误:

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

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

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


sae*_*eed -17

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

res.redirect(page, {reg_error:'username'}) // page being the url to redirect to.
Run Code Online (Sandbox Code Playgroud)

  • 为什么这是公认的答案?它的语法无效,甚至不起作用。Express 的重定向 API 中没有任何地方表明您可以将参数传递给重定向路由。http://expressjs.com/api.html#res.redirect (2认同)