1.创建并初始化项目
- 1.1 安装
Node.js:确保你已安装稳定版本的 Node.js,你可以从官方网站下载安装包。 - 1.2 创建文件夹,并在该目录下初始化一个新的 Node.js 项目,生成
package.json文件
mkdir my-express-app
cd my-express-app
npm init -y
2.安装 express 框架及相关依赖
- 2.1 依赖插件一条龙——指令
npm i express express-session cors body-parser jsonwebtoken multer crypto svg-captcha mysql2 sequelize axios
npm i nodemon -D
-
2.2 依赖插件功能说明及使用示例
- 2.2.1
express
Express 是基于 Node.js 平台,快速、开放、极简的 web 开发框架。
- 提供路由系统,用于定义请求的路由路径
- 设计优雅的 API,方便进行网站编程
- 各种 HTTP 功能帮助,快速构建网站功能
- 视图系统支持,可以使用多种模板引擎
- 大量第三方中间件扩展开发功能
- 高性能、易于上手的框架
// app.js-使用示例 // 导入express插件 const express = require("express"); // 创建程序 const app = express(); // 绑定端口并启动服务器 app.listen(3000, () => { console.log("服务器已启动:http://localhost:3000"); })- 2.2.2
nodemon
用于监视 Node.js 应用文件中的任何更改,并自动重启应用。
- 监视 Node.js 应用目录中的文件更改,当代码更改时自动重启应用
- 不需要每次手动停止和重启Node.js进程
- 提高开发效率
nodemon的常见命令行选项:- -w 指定要监视的目录
- -i 忽略某些文件更改
- -e 指定要监视的文件扩展名
- --delay 强制延时重启
// package.json- { // 其他配置 "scripts": { // 关键代码 // chcp 65001 : 防止因编码不兼容导致的乱码或执行错误。 // 因为我的入口文件在src目录下,所以用的是 nodemon src/app.js; "serve": "chcp 65001 && nodemon src/app.js" }, "devDependencies": { "nodemon": "^3.0.1" } }- 2.2.3
express-session
Express 应用中常用的 session 中间件。它允许在 Express 应用程序中实现 session(会话)管理。
session 是指通过网络连接到服务器的一个客户端,在这个客户端与服务器间交互的一段时间。在这段时间内,服务器会为这个客户端的请求创建相关的环境和数据,以保持客户端的状态。
- 允许在请求之间通过 session 存储用户数据
- 对 session 数据签名以防篡改
- 可结合 connect-mongo 等模块将 session 数据存到数据库、Redis 等
- 支持多种 session 数据存储方式
- 支持设置 session 过期时间等管理功能
// app.js // 导入会话中间件 const session = require("express-session") // 配置中间件 app.use(session({ secret: process.env.SECRET_KEY, // 无规则,字母大小写+符号,最好长度为32以上 resave: false, saveUninitialized: true }));关于
secret可以去随机凯基 - 安全密码和注册机生成器 (randomkeygen.com)随机生成并加入一下自己的内容- 2.2.4
cors
跨域的解决方案
- 允许浏览器向跨源服务器(协议、域名或端口不同的服务器)发起 XMLHttpRequest 请求。
- 通过设置 HTTP 头来对跨源请求进行安全控制。
// app.js const cors = require('cors'); app.use(cors());- 2.2.5
body-parser
跨域的解决方案
- 允许浏览器向跨源服务器(协议、域名或端口不同的服务器)发起 XMLHttpRequest 请求。
- 通过设置 HTTP 头来对跨源请求进行安全控制。
// app.js // 导入body-parser const bodyParser = require("body-parser"); // 解析为json格式 app.use(bodyParser.json()); // 解析文本格式,extended:false,表示使用系统模块querystring来处理,默认选择 app.use(bodyParser.urlencoded({extended: false}));- 2.2.6
jsonwebtoken
登陆时生成
token并在请求中校验是否过期。// app.js // 导入jsonwebtoken const jwt = require("jsonwebtoken"); // 生成 Token const token = jwt.sign({name:'user', paddword:'123456'}, 【随机密钥可用上面的网站随机生成】, {expiresIn:'4h'}); // 可以是'4h',也可以是'4s'。随你 // 校验 Token 是否过期 jwt.verify(token, 【随机密钥可用上面的网站随机生成,需要与上面生成里一致】, (err, decoded) => { if (err) { // Token 验证失败,返回错误响应 return res.status(401).send({status: 401, message: "token已过期,请重新登陆!"}); } // Token 验证成功,将解码后的数据存储到请求对象中,decoded是已解码的对象{name:'user', paddword:'123456'} req.user = decoded; // 继续处理下一个中间件或路由处理函数 next(); });- 2.2.7
multer
Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,主要用于上传文件。
// app.js // 导入multer const multer = require('multer') // 设置磁盘存储引擎 const upload = multer({ storage: multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/uploads') }, filename: function (req, file, cb) { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) cb(null, file.fieldname + '-' + uniqueSuffix) } }) }) // 上传请求处理 app.post('/profile', upload.single('avatar'), (req, res, next) => { // req.file 包含文件信息 }) // 支持多文件上传 upload.array('images', 12) // 限制文件的大小和类型 const upload = multer({ limits: { fileSize: 1000000 // 1MB }, fileFilter(req, file, cb) { if (!file.originalname.match(/\.(doc|docx)$/)) { cb(new Error('仅支持上载Word文档!')) } cb(undefined, true) } })- 2.2.8
crypto
加密,运用场景主要是密码加密方便存库。
// app.js // 导入crypto const crypto = require('crypto'); // 1.创建密码哈希(不可逆) const hash = crypto.createHash('sha256').update('【替换为你的内容】').digest('hex'); // 2/1加密数据 const cipher = crypto.createCipher('aes192', '【随机密钥可用上面的网站随机生成】'); let encrypted = cipher.update('【替换为你的内容】', 'utf8', 'hex'); encrypted += cipher.final('hex'); // 2/2解密数据 const decipher = crypto.createDecipher('aes192', '【随机密钥可用上面的网站随机生成,与加密密钥一致】'); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); // 3/1生成签名 const hmac = crypto.createHmac('sha256', '【随机密钥可用上面的网站随机生成】'); hmac.update('hello'); const sig = hmac.digest('hex'); // 3/2验证签名 hmac.update('hello'); const isEqual = hmac.digest('hex') === sig;- 2.2.9
svg-captcha
生成登录验证码
// app.js // 导入svg-captcha const svgCaptcha = require('svg-captcha'); const captcha = svgCaptcha.create(); // 参数可以自定义验证码的大小、字体大小、字母个数等 // 我是这么写的 // 生成验证码(字母数字类型) /*const captcha = svgCaptcha.create({ size: 4, // 验证码长度 ignoreChars: '0o1Il', // 过滤不生产这写字母或数字 noise: 2, // 干扰线数量,越多越看不清 color: true, background: '#ffffff', // 背景颜色 width: 200, height: 60 });*/ // 生成验证码(运算类型) const captcha = svgCaptcha.createMathExpr({ mathMax:1, mathMin:9, noise: 3, // 干扰线数量,越多越看不清 color: false, fontSize:70 }) // 将验证码文本保存在会话中并增加时效性 req.session.captcha = { text: captcha.text, timestamp: timestamp, }; // 将 SVG 转换为 Base64 编码字符串 const captchaBase64 = Buffer.from(captcha.data).toString('base64'); res.status(200).send({ status:200, message:'请求成功!', data: 'data:image/svg+xml;base64,'+captchaBase64, timestamp:timestamp });- 2.2.12
mysql2
连接和操作MySQL数据库。
- 允许浏览器向跨源服务器(协议、域名或端口不同的服务器)发起 XMLHttpRequest 请求。
- 通过设置 HTTP 头来对跨源请求进行安全控制。
// app.js // 导入mysql2 const mysql = require('mysql2'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', // 账号 database: 'test' // 数据库名 }); connection.connect(); - 2.2.1