我网站的每个页面上都有一个注册表单。在注册过程中可能会出现一些错误。发现错误后,我必须将用户返回到上一页,显示一些错误消息。问题是我不知道用户是从哪个页面进行注册的,所以我使用res.redirect('back');
. 但是,我不能只是将用户重定向回来,我还必须显示错误消息,所以我必须传递一些参数。但res.redirect('back', (reg_error:'username')})
不能直接使用,因为res.redirect()
不支持参数。如何使用某些参数呈现上一页?
7 回答
使用 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。
实现这一点的一个非常简单的方法是使用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());
});
然后像这样使用它:
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') });
});
如果您正在使用会话,则可以在重定向之前reg_error
将该对象添加到对象中。然后,当您加载上一页时req.session
,它将在对象上可用。req.session
您可以简单地将其重定向为res.redirect('..?error=1')
该?
标签告诉浏览器它是一组可选参数,..
它只是一个路径名相对调用(例如cd ..
在终端上调用以移回一个目录),您的浏览器将定向到最后带有该标签的相应页面:http://.....?error=1
然后您可以通过执行以下操作简单地在相应页面上拉出错误:
if (req.param("error" == 1)) {
// do stuff bassed off that error match
};
您可以硬编码几个不同的错误值,并根据发生的错误做出适当的响应
请注意,这会使您的网页容易受到操纵,因为用户可以输入他们自己的参数并让您的页面响应它,因此请确保您采取的操作不是您不希望人们滥用的操作。(对于简单的错误显示应该没问题)
在处理请求之前使用中间件,并将成功和错误变量与 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 对象中的错误消息
您可以使用 connect-flash 包发送错误或成功消息。
您应该将页面参数添加到表单。然后您可以在服务器上读取它并将其用于重定向。
res.redirect(page, {reg_error:'username'}) // page being the url to redirect to.