第十四节:node实操(基础结构搭建、注册、登录、jwt校验、路由自动化等)

一.  搭建步骤

(PS:本节重点分享一下思路和步骤,不贴代码了,代码太长了)

1. 安装相关程序集

  【npm install koa koa-bodyparser @koa/router】 -- koa相关

  【npm install mysql2】 -- 连接mysql的驱动

  【npm install dotenv】 -- 读取配置文件

  【npm install jsonwebtoken】 --jwt相关

  【npm install @koa/multer】  --文件上传相关

 

2. 封装koa代码

  (1).将koa基本代码抽离到app/index.js中

  (2).导入koa-bodyparser中间件,用于请求参数的json解析

  (3).对外导出app,供入口文件main.js调用

 

3. 抽离router代码

  (1).将用户相关的路由代码抽离到router/user.router.js中

  (2).对外导出,供koa代码使用

 

4. 抽离配置文件

  (1).将端口写到.env中,然后通过config/server.js读取端口

  (2).入口文件main.js通过导入server.js来获取端口

 

5. 封装mysql2连接

  (1).将mysql的相关连接抽离封装到app/database.js

  (2).通过连接池的方式建立连接,并且在使用前,先校验一下是否连接成功

  (3).对外导出promise对象供使用

 

6. 工具类抽离

  (1). md5加密方法抽离,位于:utils/md5Utils.js      

  (2). 统一错误处理方法抽离,位于:utils/error-handle.js, 需要入口函数main.js中调用:require('./utils/error-handle');

 

二.  业务剖析

1. 结构划分

  文件夹结构

    middleware: 将一些非DB业务的方法进行封装

    service: 抽离sql语句,封装为方法

    controller: 核心业务方法,调用server中封装的sql方法,各种验证已经进行完了

  以注册接口为例,router中传入多个中间件

   (1). user.middleware.js: 包含校验方法 和 密码md5加密方法

   (2). user.service.js: 抽离注册方法的sql语句

   (3). user.controller.js:  注册方法,调用user.service.js中的sql语句封装,进行最终的DB操作

  路由中间件,user.router.js, 需要在app/index中加载

   

2. 注册接口

(1). 业务分析

    A.非空校验    B.校验用户名DB中是否存在    C.密码md5加密    D.插入数据库

(2). 抽离出来多个中间件

    verfiyUser: A.非空校验    B.校验用户名DB中是否存在  

    handlePassword:C.密码md5加密  

    userController.create:D.插入数据库

(3). 路由中多个中间件的调用

   A. 本质

     一个路由中调用多个中间件的写法,中间件通过 next() 继续调用下一个

     详见:user.router.js 中写法演变

   B. 每个中间件中的参数

     可以看到最终调用形式:userRouter.post('/addUser', verfiyUser, handlePassword, userController.create);

     每个中间件传递进去的参数都是:(ctx, next)

   C. 多个中间件之间参数如何传递?

      因为每个中间件默认传递的参数都是(ctx, next),不能修改,但是我们可以借助 ctx.request.body.xx = xxx, 在中间件中进行传递。

      (或者直接 ctx.xx=xxx )

      即上一个中间件改了,下一个中间通过ctx.request.body 就能获取到了。

(4). 测试

   请求地址:http://localhost:9090/users/addUser

   参数:{"userAccount":"admin","userPwd":"123456"}

 

3. 登录接口

(1). 业务分析

     A.非空校验  B.判断该账号DB中是否存在  C.校验密码的准确性  D. 生成token

(2). 中间件拆分抽离

     verifyLogin(位于login.middleware.js): A.非空校验  B.判断该账号DB中是否存在  C.校验密码的准确性

     sign(位于login.controller.js):D. 生成token

(3). 测试

    请求地址:http://localhost:9090/CheckLogin

    参数:{"userAccount":"admin","userPwd":"123456"}

 

 

4. 通用token校验中间件

(1). 业务分析

    从Header中authorization中截取token的数据,进行解密即可

(2). 测试

    请求地址:http://localhost:9090/TestCheckToken

    参数:Header中设置  Bearer xxxx

 

5. 封装自动加载路由方法

(1).背景

    src/router文件夹下有很多业务相关的路由,比如login.router、user.router, 每增加一个都需要在 app/index中注册,很繁琐,现在想写个程序自动读取router文件夹下的文件,  自动进行注册。

(2).方法封装

    在router/index.js中声明 autoRegisterRouters方法,读取当前路由的下所有以 .router.js结尾的文件,然后进行注册即可。

 

6. 文件上传

业务1:插入用户头像

 (1). 业务分析

   抽离出来三部分:verifyToken, handleSingleUpload, create

   分别是: 校验token; 文件上传的配置; 插入数据库

 (2). 测试

   请求地址:http://localhost:9090/singleUpload      【POST】

   参数: Header中设置  Bearer xxxx

        form-data中:fileParam1参数设置为file,然后选择文件

业务2:获取用户头像进行查看

 (1). 业务分析

    上述保存的文件是不含后缀的,这里需要设置文件类型 ctx.type = mimetype,可以返回一个可读流

 (2). 测试

   请求地址:http://localhost:9090/avatar/1      【GET】

   参数: 上面的1代表userId=1

 

 

三.  其它

1. 指令的添加

  在package.json中添加指令,"serve": "nodemon ./src/main.js" ,以便于可以通过【npm run serve】启动

 

2. 格式化工具的安装

  安装 prettier,用于格式化代码     【npm install prettier -D 

查看代码

module.exports = {
	// 一行最多多少个字符
	printWidth: 180,
	// 指定每个缩进级别的空格数
	tabWidth: 2,
	// 使用制表符而不是空格缩进行
	useTabs: true,
	// 在语句末尾打印分号
	semi: true,
	// 使用单引号而不是双引号
	singleQuote: true,
	// 更改引用对象属性的时间 可选值"<as-needed|consistent|preserve>"
	quoteProps: 'as-needed',
	// 在JSX中使用单引号而不是双引号
	jsxSingleQuote: false,
	// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"<none|es5|all>",默认none
	trailingComma: 'es5',
	// 在对象文字中的括号之间打印空格
	bracketSpacing: true,
	// jsx 标签的反尖括号需要换行
	jsxBracketSameLine: false,
	// 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x
	arrowParens: 'always',
	// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
	rangeStart: 0,
	rangeEnd: Infinity,
	// 指定要使用的解析器,不需要写文件开头的 @prettier
	requirePragma: false,
	// 不需要自动在文件开头插入 @prettier
	insertPragma: false,
	// 使用默认的折行标准 always\never\preserve
	proseWrap: 'preserve',
	// 指定HTML文件的全局空格敏感度 css\strict\ignore
	htmlWhitespaceSensitivity: 'css',
	// Vue文件脚本和样式标签缩进
	vueIndentScriptAndStyle: false,
	// 换行符使用 lf 结尾是 可选值"<auto|lf|crlf|cr>"
	endOfLine: 'lf',
	// 当箭头函数仅有一个参数时不加括号
	arrowParens: 'avoid',
};

 

3. 代码片断的参数制作

   详见:https://www.cnblogs.com/yaopengfei/p/17162646.html

 

4. JWT相关

   详见:https://www.cnblogs.com/yaopengfei/p/17156611.html

 

5. postman的使用技巧

   详见:https://www.cnblogs.com/yaopengfei/p/17165184.html

     

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2023-02-24 08:17  Yaopengfei  阅读(57)  评论(0编辑  收藏  举报