评论

收藏

[JavaScript] Node.js从入门到放弃(五)

开发技术 开发技术 发布于:2021-07-08 16:44 | 阅读数:469 | 评论:0

  
Node.js从入门到放弃(五)
  前言sessionrequire模块加载机制模块加载的路径规则require模块加载的路径查找
前言
  这是该系列文章的第五篇,主要介绍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
  测试逻辑
  未登录状态或登录过期,访问首页/,显示登录过期或尚未登录
DSC0000.png

  地址栏输入/login,跳转到登录页,显示登录成功,在session中存储信息
DSC0001.png

  再次访问首页/,显示欢迎信息

DSC0002.png
  访问退出页面/exit,显示已退出登录,销毁session

DSC0003.png
  再次访问首页/,显示登录过期或尚未登录

DSC0004.png 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中已经加载过
DSC0005.png


  
关注下面的标签,发现更多相似文章