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中已經加載過

在這裏插入圖片描述

發佈了468 篇原創文章 · 獲贊 827 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章