【问题标题】:Passing variables on res.redirect在 res.redirect 上传递变量
【发布时间】:2014-07-23 23:00:36
【问题描述】:

有没有一种简单的方法可以在 node.js / express 中通过 res.redirect 传递变量,而无需将其附加到 URL,或将其存储在 cookie 或会话变量中?

我为什么要这样做?这是一个例子:

假设我在 /users 有一个用户页面。我可以在 /users/add 页面添加用户。我将表单发布到 /users/add,如果它有错误,它会重新加载带有错误消息的表单,如果它成功通过,它会重定向回 /users 页面。我想要的是能够知道我刚刚添加了一个用户并为其显示成功消息。

这是一个帖子的例子:

exports.usersAddPost = function(req, res, next) {
  // validate form

  if (!validated) {
     // go back to form
     return res.render('users/add', req.body.whatever);
  } else {
     // go back to users list
     // need some way to tell users page that a user was just added
    return res.redirect('users');
  }
};

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

我实际上决定使用会话,因为我找到了一种相当优雅的好方法。

在重定向之前,我这样设置会话:

req.session['success'] = 'User added successfully';
res.redirect('users');

在用户页面上,我检查成功变量并将其传递给我的模板(如果存在),然后将其重置为空。这非常适合我的需要。

【讨论】:

  • 这是否适用于所有用户,例如未登录的用户?
  • 您无需登录即可使用会话,所以是的,这适用于未登录的人。也就是说,我使用不同的会话变量来确定是否有人登录,如果他们没有登录,他们无论如何都无法访问此页面。
【解决方案2】:

如果您可以使用 javascript,则可以使用 http 引用并假设刚刚添加了一个用户,因为根据您的工作流程,这是发生这种情况的唯一方式:

document.referrer == "/users/add"

【讨论】:

  • 我认为这不是一个好的选择,因为引用者来自浏览器,并且可以禁用 IIRC。另外,我更喜欢服务器端解决方案。
  • 从技术上讲,一切都可以被禁用,甚至是javascript hehe。但是好的,如果您想将流程保留在服务器中,为什么不将用户页面(而不是进行重定向)呈现为带有 Location 标头的 201 Created 响应,并使用该信息(状态/位置)来在您的模板中显示一些特殊信息。
  • 我找到了一个效果很好的解决方案。感谢您的宝贵时间。
  • 你能解释一下解决方案吗?
【解决方案3】:

只显示带有元刷新的简单 html 怎么样?示例:

function redirectFlash(url, timeout, msg) {
  var defaultTimeout = 5;
  if (typeof timeout === 'string') {
    msg = timeout;
    timeout = defaultTimeout;
  } else if (timeout === undefined) {
    msg = '';
    timeout = defaultTimeout;
  }
  return '<html><head><title>Redirecting ...</title><meta http-equiv="refresh" content="'
         + timeout
         + ';url='
         + url
         + '"></head><body>'
         + msg
         + '<br /><a href="'
         + url
         + '">Click here to return manually</a></body></html>';
}

exports.usersAddPost = function(req, res, next) {
  // validate form

  if (!validated) {
     // go back to form
     return res.render('users/add', req.body.whatever);
  } else {
     // go back to users list
     // need some way to tell users page that a user was just added
    return res.end(redirectFlash('/users', 'User added successfully. Returning you to the user list ...'));
  }
};

【讨论】:

  • 这感觉像是 15 年前可能还不错的解决方案,但我不认为这是一个良好的用户体验。我找到了解决方案。不过我很感激你的努力。
  • 我觉得还是可以的,尤其是你提到没有url参数,没有会话存储,也没有cookies。 :-)
  • 是的,这并没有留下太多的空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多