Express Sessions

如何使用sessions在請求之間識別用戶 預設情況下,Express請求是依序處理的,並且無法將請求相互關聯起來。除非使用某種機制來實現,否則無法知道該請求是否來自先前已執行請求的客戶端。 這就是sessions的作用。 一旦實施,您的API或網站的每個用戶將被分配一個唯一的session,這使您可以存儲用戶狀態。 我們將使用由Express團隊維護的express-session模塊。 您可以使用以下命令進行安裝 npm install express-session 一旦安裝完成,您可以在應用程序中實例化它 const session = require('express-session') 這是一個中間件,所以您需要在Express中安裝它 const express = require('express') const session = require('express-session') const app = express() app.use(session({ 'secret': '343ji43j4n3jn4jk3n' })) 完成後,應用程序路由的所有請求都將使用sessions。 secret是唯一的必需參數,但還有很多其他可用的參數。它應該是您應用程序的隨機唯一字符串。 session附加到請求上,所以您可以在這裡使用req.session進行訪問: app.get('/', (req, res, next) => { // req.session } 此對 象可用於從session獲取數據,並用於設置數據: req.session.name = 'Flavio' console.log(req.session.name) // 'Flavio' 在存儲時,此數據序列化為JSON,因此您可以安全使用嵌套對象。 您可以使用sessions將數據傳遞給稍後執行的中間件,或者在後續的請求中檢索數據。 會話數據存儲在哪裡?這取決於您如何設置express-session模塊。 它可以將會話數據存儲在 內存,不適用於生產環境 如MySQL或Mongo之類的 數據庫 如Redis或Memcached之類的 內存緩存 在 https://github.com/expressjs/session 中有一個支持各種不同兼容緩存存儲的第三方包列表 所有解決方案都將會話ID存儲在cookie中,並在服務器端保存數據。客戶端將在cookie中接收會話ID,並將其與每個HTTP請求一起發送。 我們將在服務器端引用這個會話ID,以將其與本地存儲的數據關聯起來。 內存是默認選項,您無需進行特殊設置,但它只適用於開發目的。 最佳選擇是像Redis這樣的內存緩存,您需要設置它自己的基礎架構。 在Express中管理會話的另一個流行包是cookie-session,它的一大不同之處在於它將數據客戶端存儲在cookie中。我不建議這樣做,因為將數據存儲在cookie中意味著它存儲在客戶端,並在用戶發出的每個請求中來回傳輸。它的大小也受限制,因為它只能存儲4KB的數據。 Cookie還需要進行安全配置,但默認情況下它們並未進行安全配置,因為安全Cookie僅適用於HTTPS站點,如果有代理,則需要對其進行配置。

Express 中间件

中间件(Middleware)是一种钩入路由过程的函数,它在链中的某一点执行任意操作(取决于我们想要它执行的操作)。 中间件常用于编辑请求或响应对象,或在到达路由处理程序代码之前终止请求。 添加中间件到执行堆栈的方式如下: app.use((req, res, next) => { /* */ }) 这类似于定义路由,但除了请求和响应对象实例之外,我们还有一个对下一个中间件函数的引用,我们将其分配给变量 next。 我们总是在我们的中间件函数的结尾调用 next(),以便将执行传递给下一个处理程序。除非我们想要提前结束响应并将其发送回客户端。 通常情况下,您会使用预先创建的中间件,以 npm 包的形式存在。可以在 这里 找到可用中间件的大列表。 一个例子是 cookie-parser,它用于将 cookie 解析为 req.cookies 对象。您可以使用 npm install cookie-parser 安装它,并如下使用: const express = require('express') const app = express() const cookieParser = require('cookie-parser') app.get('/', (req, res) => res.send('Hello World!')) app.use(cookieParser()) app.listen(3000, () => console.log('Server ready')) 我们还可以将中间件函数设置为仅对特定路由运行(而非全部)。方法是将其作为路由定义的第二个参数: const myMiddleware = (req, res, next) => { /* ... */ next() } app.get('/', myMiddleware, (req, res) => res....

Express 模板

Express 可以处理服务器端模板引擎。模板引擎允许我们向视图中添加数据,并根据数据动态生成 HTML。 Express 默认使用 Jade 作为模板引擎,但 Jade 是 Pug 的旧版,具体来说是 Pug 1.0。 由于商标问题,该项目在 2016 年发布了 2.0 版本时将名称从 Jade 更改为 Pug。你仍然可以使用 Jade,即 Pug 1.0,但未来最好使用 Pug 2.0。 尽管 Jade 的最后一个版本已经有三年时间了(截至文章撰写时的夏季 2018),但在 Express 中仍然是默认设置,这是为了向后兼容。 在任何新项目中,你应该使用 Pug 或其他你选择的引擎。Pug 的官方网站是 https://pugjs.org/。 你可以使用许多不同的模板引擎,包括 Pug、Handlebars、Mustache、EJS 等。 使用 Pug 首先我们需要安装 Pug: npm install pug 在初始化 Express 应用程序时,我们需要设置 Pug: const express = require('express') const app = express() app.set('view engine', 'pug') 现在我们可以开始在 .pug 文件中编写模板了。 创建一个关于页面的视图: app.get('/about', (req, res) => { res....

Express, 請求參數

一個方便的參考,列出所有請求物件屬性以及如何使用它們 請求參數 我提到過請求物件保存了所有的HTTP請求信息。 這些是你可能會用到的主要屬性: 屬性 描述 .app 保存了對Express應用程式物件的引用 .baseUrl 應用程式回應的基本路徑 .body 包含請求主體中提交的資料(必須在可以訪問它之前對其進行解析和填充) .cookies 包含請求中傳送的 cookie(需要 cookie-parser 的中介軟體) .hostname 主機名稱,根據 Host HTTP 標頭 的值 .ip 客戶端的 IP 位址 .method 使用的 HTTP 方法 .params 命名路由參數 .path URL 路徑 .protocol 請求協議 .query 包含請求中使用的所有查詢字串的物件 .secure 如果請求是安全的(使用 HTTPS)則為 true .signedCookies 包含請求中傳送的簽名 cookie(需要 cookie-parser 的中介軟體) .xhr 如果請求是 XMLHttpRequest 則為 true 如何使用 Express 擷取 GET 查詢字串參數 查詢字串是 URL 路徑後面的部分,以問號 ? 開頭。 例如: ?name=flavio 可以使用 & 添加多個查詢參數: ?name=flavio&age=35 如何在 Express 中獲取這些查詢字串的值?...

logging-all-the-requests-coming-through-an-express-app

#記錄經由 Express 應用程式的所有請求 我有一個需求,希望以簡單的方式記錄進入我的 Express 應用程式的所有請求,只要將它們記錄到控制台就好,不需要花太多時間(也不需要)搭建更複雜的環境。 因此,我安裝了 express-requests-logger: npm install express-requests-logger 然後在我的 Node 應用程式中引入它: import audit from 'express-requests-logger' 並將它作為中介軟體添加到我的 Express 應用程式中: app.use(audit()) 完成! 你也可以這樣做: app.use((req, res, next) => { console.log(req); next(); }); 但是 express-requests-logger 提供了許多選項、格式化和過濾器可供您使用,可以輕鬆達到您的要求。

什麼是 Webhook?

在編寫整合不同服務的程式碼時,使用 Webhook 是很常見的。 什麼是 Webhook? Webhook 是一個 POST 請求處理器,它會等待有人呼叫它,在有人呼叫時進行某些工作。 讓我舉個例子。我使用 Paddle 來銷售我的 Bootcamp,每當有人註冊時,我的 Webhook 會被呼叫並傳遞一些 JSON 資料。 這些資料包括客戶的電子郵件、客戶姓名和已購買的產品。 然後,Webhook 負責將客戶添加到 Airtable 底稿中,並向客戶發送歡迎郵件和一些資訊。 在我這個特定的案例中,Webhook 是使用 Express 所建構的 Node.js 應用程式,但它可以是任何能夠接受網路請求且可從互聯網訪問的東西。我將它放在了一個 VPS 上,但也可以是一個無伺服器函數。 支付平台提供 Webhook 是很常見的 - 它們處理付款,然後讓你執行你可能需要執行的「事情」。 Webhook 的另一個使用案例是在你想要時在一台機器上執行任務。例如,所有部署平台都提供 Webhook,你可以呼叫該 Webhook 來觸發新的部署。 我在 Netlify 或 Cloudflare Pages 使用它。我在 IFTTT 上設定了一個任務,每天早上 8 點觸發部署程序,所以我前一天安排的文章現在被發佈了,因為它的發佈日期已經過去了。 這對於我的一貫性非常重要,因為我知道每天早上 8 點我的靜態網站的文章都會被發佈。我不再需要手動執行此動作。 許多無代碼工具允許你使用它們來創建自動化。它們是非常酷的。 如果你思考一下,Webhook 就是讓互聯網保持連接的黏合劑。它們確實讓我能運行我的業務,所以我對它們的存在感到感激。

使用 Express 擷取 GET 查詢字串參數

查詢字串是指位於 URL 路徑之後並以問號(’?’)開頭的部分。讓我們看看如何獲取這些屬性及其值。 例如: ?name=flavio 可以使用 & 添加多個查詢參數: ?name=flavio&age=35 要如何在 Express 中獲取這些查詢字串值? Express 讓我們輕鬆完成,它會為我們填充 Request.query 物件: const express = require('express') const app = express() app.get('/', (req, res) => { console.log(req.query) }) app.listen(8080) 該物件中的每個查詢參數都填入一個屬性。 如果沒有查詢參數,則該物件為空。 這使得可以使用 for...in 迴圈來進行迭代: for (const key in req.query) { console.log(key, req.query[key]) } 這將輸出查詢屬性的鍵和值。 也可以單獨存取屬性: req.query.name //flavio req.query.age //35

使用 Express 擷取 POST 查詢參數

在本篇文章中,我們將介紹如何使用 Express 擷取 POST 查詢參數。 POST 查詢參數通常是由 HTTP 客戶端傳送的,例如表單提交或是進行 POST 請求時傳送的資料。 如何存取這些資料呢? 如果資料是以 JSON 格式傳送,使用 Content-Type: application/json,你需要使用 express.json() 中介軟體: const express = require('express') const app = express() app.use(express.json()) 如果資料是以 Content-Type: application/x-www-form-urlencoded 格式傳送,你需要使用 express.urlencoded() 中介軟體: const express = require('express') const app = express() app.use(express.urlencoded({ extended: true })) 在兩種情況下,你可以透過 Request.body 來存取資料: app.post('/form', (req, res) => { const name = req.body.name }) 需要注意的是,舊版的 Express 需要使用 body-parser 模組來處理 POST 資料,但從 Express 4.16 版本(於2017年9月發佈)開始,已經不再需要使用該模組。

使用 Express 發送 JSON 回應

如何使用 Node.js 的 Express 函式庫來提供 JSON 資料 當在 Express 上監聽連線時,每個網路呼叫都會呼叫回呼函式並傳入一個 Request 物件實例與一個 Response 物件實例。 範例: app.get('/', (req, res) => res.send('Hello World!')) 在這個例子中,我們使用了 Response.send() 方法,該方法接受任何字串。 你可以使用 Response.json() 方法將 JSON 資料傳送給客戶端,這是一個非常有用的方法。 它接受一個物件或陣列,並在傳送之前將其轉換為 JSON 格式: res.json({ username: 'Flavio' })

使用 Express 處理重新導向

如何在伺服器端重新導向到其他頁面 重新導向在網頁開發中很常見。你可以使用 Response.redirect() 方法來創建重新導向: res.redirect('/go-there') 這將創建一個 302 重新導向。 使用以下方法來進行 301 重新導向: res.redirect(301, '/go-there') 你可以指定絕對路徑 (/go-there)、絕對 URL (https://anothersite.com)、相對路徑 (go-there) 或使用 .. 回到上一層: res.redirect('../go-there') res.redirect('..') 你還可以使用以下方式重新導向回 Referer 的 HTTP 標頭值(如果沒有設定則預設為 /): res.redirect('back')