【问题标题】:Passing error message to template through redirect in Express/Node.js通过 Express/Node.js 中的重定向将错误消息传递给模板
【发布时间】:2011-10-28 02:05:53
【问题描述】:

在我的 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,我宁愿避免它。还有其他方法吗?

【问题讨论】:

标签: javascript redirect node.js express


【解决方案1】:

你需要使用flash notifications,它是内置在express中的。

您将添加这样的消息:req.flash("error", "Invalid form...");

您需要一个动态处理程序来将消息添加到您呈现的模板中,或者您可以查看 TJ 为 express 制作的消息。 (express-messages)

【讨论】:

  • flash 不适用于 node 4.0 或 mustache 等模板。
【解决方案2】:

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

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

然后您可以通过以下操作在相应页面上简单地拉出错误:

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

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

【讨论】:

  • 感谢您提供替代方案,但为什么或何时会比使用 Flash 通知更好?
  • 哦,哇,没有注意到你甚至在问题的底部自己提出了这个 - 不要认为有任何明显的好处;它实现起来更简单一些,并且错误更明显/可跟踪,因为它们在 URL 上,但它们应该完成同样的事情。如果您的 {做某事} 比仅仅显示一些内容涉及更多一点,那么以这种方式处理它可能有点不安全,因为用户可以通过自己在 URL 上输入错误消息来利用它 - 但否则会更直接
猜你喜欢
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2011-03-22
  • 2011-12-27
相关资源
最近更新 更多