【问题标题】:Express.JS: Attach cookie to statically served contentExpress.JS:将 cookie 附加到静态提供的内容
【发布时间】:2013-01-15 17:40:37
【问题描述】:

我使用 Express.JS 提供静态内容:

express.use(express.static('./../'));

index.html 被提供时,我想在响应的旁边发送一个cookie,指示用户是否登录。通常应该使用res.cookie(),但我看不到如何将它用于静态提供的内容。

【问题讨论】:

  • static 中有错字:)

标签: javascript node.js express


【解决方案1】:

不确定为什么需要这样做,但您可以将自己的中间件放在 static 模块之前。

下面的快速破解应该可以工作:

function attach_cookie(url, cookie, value) {
  return function(req, res, next) {
    if (req.url == url) {
      res.cookie(cookie, value);
    }
    next();
  }
}

app.configure(function(){
  app.use(attach_cookie('/index.html', 'mycookie', 'value'));
  app.use(express.static(path.join(__dirname, 'public')));
});

上面在中间件链中插入另一个函数表示使用static中间件之前。如果 URL 与您要查找的特定 URL 匹配,新层会将 cookie 附加到响应中,并将响应传递到链的下方。

【讨论】:

  • 就目前而言,configure 已从最新版本的 express 中弃用和删除
【解决方案2】:

还可以考虑以下方法:

  1. 如果您的 express 在 web-server 之后,您可以提供静态文件而无需打扰 express - 它应该比通过中间件更快。如果你使用 nginx,这会有所帮助:Nginx Reverse Proxying to Node.js with Rewrite.

  2. 假设你的静态文件里面有javascript,你也可以直接在客户端设置cookies,只从express请求这个cookie所需的数据:

    document.cookie = "user_id=" + user_id;
    

    Flanagan 的 JS 权威指南(第 6 版!)很好地介绍了如何在客户端 javascript 中使用 cookie(除了是 JavaScript books 中最好的:)。

这可能是一个微不足道的建议,但我已经看到了以下流程(不止一次):客户端发送 API 请求(显然,它附加了一个 cookie),服务器从 cookie 中获取数据并完全提供响应建立在此 cookie 中包含的数据之上。所有这一切,而不是只是悄悄地在客户端读取这个 cookie。基本上客户端会询问服务器它在自己的 cookie 中有什么。

在您的场景中,您只需要请求 user_id/access_key 一次,然后始终检查客户端中的 cookie,仅访问服务器以获取客户端尚未拥有的数据,但存储和检查会话状态,也许,在大多数页面中使用的一些紧凑数据(例如用户名)在本地cookie中(您也可以将数据缓存在本地存储中,以进一步减少服务器负载)。在这种情况下,express 甚至不知道用户是否不小心刷新了页面(当然,如果您不更改 URL 以反映应用程序状态,或者只更改#-part)。

【讨论】:

    【解决方案3】:

    自从 Express.js v4 以来 app.configure 是 removed,我想做一个更新。

    对于 Express.js 版本 > 4,通过在 express.static(root, [options]) 方法中传递选项来初始化我的 app,在该方法中,您可以在名为 setHeaders 的属性中传递 Set-Cookie 标头:

    app.use(express.static(publicPath, {
      setHeaders: function (res, path, stat) {
        res.set('Set-Cookie', "myCookie=cookieValue;Path=/")
      }
    }));
    

    设置Path=/ 很重要,否则 express 会在客户端创建大量重复的 cookie。

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 2018-04-05
      • 2012-04-18
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多