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中已经加载过

在这里插入图片描述

发布了459 篇原创文章 · 获赞 800 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_42813491/article/details/104037594