Node.js從入門到放棄(五)
前言
這是該系列文章的第五篇,主要介紹express中session的使用和Node.js中require的模塊加載機制
session
session和cookie都是客戶端和服務端通信的一種手段,可存儲數據。cookie存儲在客戶端,安全性較低,session存儲在服務端,安全性較高。下面以express-session爲例,介紹一下session的簡單使用
項目初始化
- 新建項目文件夾express-dev(可自定義)
- 進入項目後,命令行輸入npm init -y
- 安裝依賴: npm i express express-session
app.js
- 根目錄新建app.js,並寫入如下內容
const express = require("express")
const session = require("express-session")
const router = require("./router")
const app = express();
//session配置 一定要放在路由掛載前
app.use(session({
secret: 'lengyuexin',//配置加密字符串(在原有加密基礎上加密)
resave: false,//官方推薦配置
saveUninitialized: false,//官方推薦配置
cookie: {
maxAge: 60000,//cookie存活時長 60s
httpOnly: true//設置後無法通過document.cookie獲取,防止js劫持
}
}))
//路由配置
app.use(router)
app.listen(3000, () => {
console.log('run server--------')
})
router.js
- 根目錄新建router.js,並寫入如下內容
const express = require("express");
const router = express.Router();
router.get('/', (req, res) => {
//訪問session中存儲的數據
if (req.session.isLogin) {
res.send('歡迎:' + req.session.name);
} else {
res.send('登錄過期或尚未登錄');
}
})
router.get('/login', (req, res) => {
//使用session存儲數據
req.session.name = "冷月心";
req.session.isLogin = true;
res.send('登錄成功');
})
router.get('/exit', (req, res) => {
//銷燬session
req.session.destroy(() => {
res.send('已退出登錄');
})
})
module.exports = router
測試邏輯
未登錄狀態或登錄過期,訪問首頁/,顯示登錄過期或尚未登錄
地址欄輸入/login,跳轉到登錄頁,顯示登錄成功,在session中存儲信息
再次訪問首頁/,顯示歡迎信息
訪問退出頁面/exit,顯示已退出登錄,銷燬session
再次訪問首頁/,顯示登錄過期或尚未登錄
require模塊加載機制
我們常使用require加載某個模塊(或文件),但也許並沒有在意細節上的東西,下面介紹模塊加載的路徑規則和加載時候的路徑查找
模塊加載的路徑規則
- 模塊導入的時候,層級路徑不可省略./(當前目錄),…/(上級目錄)等標誌性路徑
- 支持當前文件模塊所屬磁盤根路徑訪問,但幾乎不用(/xxx)
- node內置支持的拓展名可省略,
.js文件 .node文件 .json文件
- 除內置拓展名外,其他拓展名被當作js文件處理
- 爲了提高查找效率,
.js以外的文件,都應該加上拓展名
- 不論如何查找,最終對應的基本上都是一個文件
require模塊加載的路徑查找
上邊提到的路徑規則就是針對自定義的文件模塊的路徑查找,這個時候,即使是當前模塊./也不能省略。下面介紹內置模塊和通過npm安裝的第三方模塊的路徑查找機制
內置模塊(也稱核心模塊)
核心模塊文件已經被編譯到二進制文件中,按名字加載即可,且核心模塊的加載速度是最快的
第三方模塊
第三方模塊的加載機制是最爲複雜的,有很多查找規則,以查找express爲例
const express=require("express")
- 先去根目錄查找
node_modules
目錄 - 進入後查找express文件夾,此時目錄爲
node_modules/express
- 查找package.json文件,此時目錄爲
node_modules/express/package.json
- 查找package.json文件中的main屬性,該屬性會指定文件入口,對應某個文件
- 注意,package.json和其中的main屬性,都未必一定存在(express就沒有main屬性)
- 即便package.json文件中的main屬性存在,對應的文件拓展名也未必正確,會走一個拓展名分析的流程
- 若package.json文件和其中的main屬性不存在或main屬性指定的文件名錯誤,依次查找index.js、index.json、index.node
- 若以上規則都查找一次,還沒有找到,就報錯
優先緩存加載
爲了提高模塊加載效率,在上述的加載機制和路徑規則基礎上,還有一個規則,優先從緩存加載,舉個例子
- app.js
require("./a")
require("./b")
- a.js
console.log("a被加載了")
require("./b")
- b.js
console.log("b被加載了")
- 執行 node app.js ,b被加載了只會被輸出一次,因爲a中已經加載過