2013-01-15 36 views
2

我用Express.JS提供静态内容:Express.JS:将cookie来静态地提供内容

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

index.html供应,我想送一个cookie旁边,表示用户是响应是否登录。通常应该使用res.cookie(),但我无法看到如何将其用于静态提供的内容。

+0

''''静态'''有一个错字:) – esp

回答

5

不确定为什么你需要这样做,但是你可以在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附加到响应中,并将响应传递到链中。

0

还采取下列措施考虑:

  1. 如果你的快递是背后的Web服务器可以提供静态文件,而不会打扰明确 - 它应该是比通过中间件更快。如果你使用nginx,这可以帮助:Nginx Reverse Proxying to Node.js with Rewrite

  2. 假设您的静态文件有它的JavaScript,你也可以直接设置cookie在客户端只请求表示你需要为这个cookie中的数据:

    document.cookie = "user_id=" + user_id; 
    

    弗拉纳根的JS权威指南(版6)对于如何在客户端JavaScript中使用cookie有很好的覆盖率(除了在JavaScript books之间是最好的:)。

它可以是一个简单的建议,但我已经看到下面的流程(不止一次):客户端发送API请求(其中有连接到它,显然是一个cookie),服务器从cookie获取数据和提供完全基于此Cookie中包含的数据的响应。所有这些,而不是只是在客户端静静地阅读这个cookie。基本上客户端询问服务器它在自己的cookie中有什么。

在你的场景中,你只需要一次请求user_id/access_key,然后总是检查客户端中的cookie,去服务器仅处理客户端尚未拥有的数据,但存储并检查会话状态,也许,在本地Cookie中的大多数页面中使用的一些压缩数据(如用户名,例如)可以缓存数据(甚至可以进一步减少服务器负载)。在这种情况下,express甚至不会知道用户是否意外刷新页面(当然,如果您不更改URL以反映应用程序状态,或者仅更改#部分)。