4

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

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

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

4

3 回答 3

8

不知道为什么需要这样做,但是您可以将自己的中间件放在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')));
});

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

于 2013-01-15T19:30:20.197 回答
1

还要考虑以下方法:

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

  2. 假设您的静态文件中包含 javascript,您还可以直接在客户端设置 cookie,仅从 express 请求此 cookie 所需的数据:

    document.cookie = "user_id=" + user_id;
    

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

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

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

于 2013-01-16T16:14:11.797 回答
1

由于 app.configure 自 Express.js v4 以来已被删除,我想进行更新。

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

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

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

于 2018-10-13T18:15:58.570 回答