使用nodejs(3)_封装的公用方法,方便后续使用

198 阅读2分钟

1-自定义常量,保存用户信息,方便全局使用

    /**
     * 描述: 自定义常量
    */


    module.exports = {
      CODE_ERROR: -1, // 请求响应失败code码
      CODE_SUCCESS: 200, // 请求响应成功code码
      CODE_TOKEN_EXPIRED: 401, // 授权失败
      PRIVATE_KEY: 'jackchen', // 自定义jwt加密的私钥
      JWT_EXPIRED: 60 * 60 * 24, // 过期时间24小时
      USER_MESSAGE: [ //用户信息
        {
          username: '001',
          userMessage: {
            userChinese: 'hsj',
            department: 0,
            departChinese: '技术一部'
          }
        },
        {
          username: '002',
          userMessage: {
            userChinese: 'swh',
            department: 1,
            departChinese: '技术二部'
          }
        },
        {
          username: '003',
          userMessage: {
            userChinese: 'gjy',
            department: 1,
            departChinese: '技术二部'
          }
        }
      ]
    } 

2-封装md5方法

    /**
     * 描述: 封装md5方法
    */

    const crypto = require('crypto'); // 引入crypto加密模块

    function md5(s) {
      return crypto.createHash('md5').update('' + s).digest('hex');
    }

    module.exports = md5;

3-设置token验证,目前还未使用,在app中当作中间件调用,关键的一点是设置白名单,不进行验证

    /**
     * 描述: jwt-token验证和解析函数
    */

    const jwt = require('jsonwebtoken'); // 引入验证jsonwebtoken模块
    const expressJwt = require('express-jwt'); // 引入express-jwt模块
    const { PRIVATE_KEY } = require('./constant'); // 引入自定义的jwt密钥

    // 验证token是否过期
    const jwtAuth = expressJwt({
      // 设置密钥
      secret: PRIVATE_KEY,
      // 设置为true表示校验,false表示不校验
      credentialsRequired: true,
      // 自定义获取token的函数
      getToken: (req) => {
        if (req.headers.authorization) {
          return req.headers.authorization
        } else if (req.query && req.query.token) {
          return req.query.token
        }
      }
      // 设置jwt认证白名单,比如/api/login登录接口不需要拦截
    }).unless({
      path: [
        '/',
        '/api/login',
        '/api/queryTaskList',
        '/api/queryTaskProject',
        '/api/addTaskProject',
        '/api/editTaskProject',
        '/api/updateListStatus',
        '/api/queryHistoryList',
        '/api/queryManageList',
        '/api/addManageList',
        '/api/editManageList',
        '/api/deleteManageList',
        '/api/exportExcel',
        '/api/exportTotalExcel'
      ]
    })

    // jwt-token解析
    function decode(req) {
      const token = req.get('Authorization')
      return jwt.verify(token, PRIVATE_KEY);
    }

    module.exports = {
      jwtAuth,
      decode
    }

4-建立连接_封装根据sql语法查询连接_封装根据sql语法查询一条语句

    /**
     * 描述: 连接mysql模块
    */


    const mysql = require('mysql');
    const config = require('../db/dbConfig');

    // 连接mysql
    function connect() {
      const { host, user, password, database } = config;
      return mysql.createConnection({
        host,
        user,
        password,
        database
      })
    }

    // 新建查询连接
    function querySql(sql) {
      const conn = connect();
      return new Promise((resolve, reject) => {
        try {
          conn.query(sql, (err, res) => {
            if (err) {
              reject(err);
            } else {
              resolve(res);
            }
          })
        } catch (e) {
          reject(e);
        } finally {
          // 释放连接
          conn.end();
        }
      })
    }

    // 查询一条语句
    function queryOne(sql) {
      return new Promise((resolve, reject) => {
        querySql(sql).then(res => {
          console.log('res===查询一条语句',res)
          if (res && res.length > 0) {
            resolve(res[0]);
          } else {
            resolve(null);
          }
        }).catch(err => {
          reject(err);
        })
      })
    }

    //获取用户信息
    function getUerMessage(userData, userName) {
      let getUser = userData.find((item)=> item.username==userName)
      return getUser
    }

    module.exports = {
      querySql,
      queryOne,
      connect,
      getUerMessage
    }

5-根据项目需求,需要实现swagger效果,方便测试和前端联调。封装完成后需要在入口文件中调用

    const path = require('path')
    const express = require('express')
    const swaggerUI = require('swagger-ui-express')
    const swaggerDoc = require('swagger-jsdoc')
    //配置swagger-jsdoc
      const options = {
        definition: {
          openapi: '3.0.0',
          info: {
            title: 'api',
            version: '1.0.0',
            description: `后台api`
          }
        },
        // 去哪个路由下收集 swagger 注释
        apis: [path.join(__dirname,'../routes/*.js')]
      }

      var swaggerJson = function (req, res) {
        res.setHeader('Content-Type', 'application/json');
        res.send(swaggerSpec);
      }
      const swaggerSpec = swaggerDoc(options)

      var swaggerInstall = function(app) {
        if (!app){
          app = express()
        }
        // 开放相关接口,
        app.get('/swagger.json', swaggerJson);
        // 使用 swaggerSpec 生成 swagger 文档页面,并开放在指定路由
        app.use('/swagger', swaggerUI.serve, swaggerUI.setup(swaggerSpec));
      }
      module.exports = swaggerInstall