nodeJS+express搭建服务端

183 阅读6分钟

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();