在Express/Node.js中通过重定向将错误消息传递给模板

12

我在我的Node.js应用程序中有一个函数(由Express路由),该函数向用户呈现一个表单:

app.get('/register', function (req, res) {
  res.render('form');
});

我有另一个函数,路由到相同的URL,但处理POST请求,接收前一个表单提交的数据。如果表单未通过验证,则将用户重定向回表单;否则,它会执行应该执行的操作:

app.post('/register', function (req, res) {
  if (validate(req.registerForm)) return res.redirect('back');
  persistStuff(req.registerForm, function (err, data) {
    // Do error verification etc.
    res.redirect('back')
  });
});

我想做的是发送一个错误消息,让它在这一行中呈现:

if (validate(req.registerForm)) return res.redirect('back');

要写出类似于

if (validate(req.registerForm)) return res.render('form', {msg:'invalid'});

这是不被接受的,因为我想遵循POST-REDIRECT-GET模式。我可以做一些像这样的事情:

if (validate(req.registerForm)) return res.redirect('/register?msg=invalid');

但是在我的代码中硬编码一个URL并不理想,我希望避免这种情况。有其他的方法吗?


https://dev59.com/tm035IYBdhLWcg3wNdPg#1aOeEYcBWogLw_1bDwJn - chovy
2个回答

8
你需要使用 flash 通知,它已经集成到 express 中。
您可以像这样添加消息:req.flash("error", "无效的表单..."); 您需要一个动态处理程序将消息添加到渲染模板中,或者您可以查看 TJ 为 express 制作的那些。(express-messages

2
Flash在Node 4.0或像Mustache这样的模板中无法工作。 - ingrid

3

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

? 标签告诉浏览器这是一组可选参数,.. 仅是相对召回的路径名(就像在终端上调用cd ..返回上一个目录),然后您的浏览器将定向到带有该标记结尾的适当页面:http://.....?error=1

然后,您只需通过执行以下操作即可在适当的页面上提取错误:

if (req.param("error" == 1)) { // 基于该错误匹配做某些事情 };

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


谢谢提供另一种选择,但是在什么情况下使用它会比使用闪现通知更好呢? - brandizzi
1
哇,没想到您在问题的底部甚至自己建议了这个 - 实际上并没有明显的好处; 它更容易实现,因为错误在URL上更加可见/可跟踪,但它们应该可以完成相同的工作。如果您的 {do something} 比仅显示某些内容要复杂一些,那么以这种方式处理可能有点不安全,因为用户可以通过在URL上输入错误消息来利用它 - 但否则就更加简单明了了。 - gadu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接