簡體   English   中英

Express.JS:將 cookie 附加到靜態提供的內容

[英]Express.JS: Attach cookie to statically served content

我使用 Express.JS 提供 static 內容:

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

index.html提供服務時,我想在響應中發送一個 cookie,指示用戶是否登錄。 通常應該使用res.cookie()但我看不到如何將它用於靜態提供的內容。

不知道為什么需要這樣做,但是可以將自己的中間件放在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附加到響應中,並將響應進一步傳遞到鏈下。

還考慮以下方法:

  1. 如果您的快遞服務落后於Web服務器,則可以投放靜態文件而不會打擾快遞服務-它應該比通過中間件更快。 如果使用nginx,這將有所幫助: Nginx使用Rewrite反向代理到Node.js。

  2. 假設您的靜態文件中包含javascript,您也可以直接在客戶端設置cookie,僅從表達請求此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)。

由於自Express.js v4起刪除了 app.configure,因此我想進行更新。

對於大於4的Express.js版本,通過在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的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM