Skip to content

创建项目

  1. 创建空文件夹

  2. 在终端执行

    sh
    npm init

安装包

sh
npm i mysql;
npm i express;
npm i body-parser;
npm i cors;
npm i md5;
npm install -g nodemon;		# 热加载(全局安装一次即可)

入口文件

  1. 在根目录创建入口文件 .js ,文件名可随意,通常使用 app、main、index 等。

  2. 代码如下:app.js

    js
    const express = require('express');
    const cors = require('cors');
    const bp = require('body-parser');
    const app = express();
    
    app.use(cors({
        origin: ['http://localhost:8080']
    }))
    app.use(bp.urlencoded({ extended: true }));
    app.use(require('./router/user'));
    
    app.listen(3000, () => {
        console.log('服务器请求成功:http://localhost:3000');
    })
  3. 代码注释

    • 6~8 行:配置跨域。
    • 14 行:这里引入的 /router/user.js 文件见下文。

目录结构

  1. /router:控制器目录。通常情况下每张数据表对应一个 .js 文件,文件内编写各个表要实现的接口。

  2. /utils:工具类目录。

    • 数据库工具类:db.js

      js
      const mysql = require('mysql');
      // 数据库配置
      const db = mysql.createPool({
          host: '127.0.0.1',
          user: 'root',
          password: '123456',
          database: 'test',
      })
      // error 对象
      const errObj = { code: 400, msg: '服务异常' };
      
      /**
       * SQL 映射器
       * @param {String} sql SQL 语句
       * @param {String / Number / Array / Object} options 参数
       */
      const sql = (sql, options) => new Promise((t,f) => {
          db.query(sql, options, (err, res) => {
              if (err) f(errObj);
              else {
                  if (sql[0] == 's') t(res.length > 1 ? res : res[0] || null);
                  else t(res.affectedRows > 0 ? t(true) : f(errObj));
              }
          })
      })
      
      module.exports = { db, sql }

      注:21~22 行进行 sql 判断,若 sql 是查询语句,返回查询结果;否则根据执行 sql 后影响的行数 affectedRows 返回结果。

    • 全局工具类:tool.js

      js
      const md5 = require('md5');
      
      /**
       * 检查请求参数
       * @param {Object} e 参数对象
       * @param {Object} dict 参数字典
       */
      const inspect = (e, dict) => {
          let res = { code: 200, msg: 'ok' };
          let keys = Object.keys(dict);
          for(let index in keys) {
              let key = keys[index];
              if (!e[key]) {
                  res.code = 500 + Number(index);
                  res.msg = `${dict[key]}不能为空`;
                  break;
              }
          }
          return res;
      }
      
      /**
       * MD5 加密
       * @param {*} value 需要加密的值
       */
      const getMD5 = (value) => {
          return md5(value).toUpperCase();
      }
      
      module.exports = {
          inspect,    // 检查请求参数
          getMD5,     // MD5 加密
      }

      注:此文件非必要,根据个人习惯编写,小编喜欢把一些公共的方法封装到本类中。

开发接口

  1. 下面是测试项目代码,代码质量一般,仅供参考,开发项目时根据实际业务编码。

  2. /router/user.js

    js
    const express = require('express')
    const router = express.Router()
    const db = require('../utils/db')
    const tool = require('../utils/tool')
    
    // 登录
    router.post('/user/login', (req, res) => {
        const { body } = req;
        const { account, password } = body;
        let data = tool.inspect(body, { account: '账号', password: '密码' });
    
        if (data.code == 200) {
            db.sql('select * from admin where account = ?', account).then(e => {
                if (e) {
                    if (e.password != tool.getMD5(password)) data = { code: 503, msg: '密码错误' };
                    else {
                        delete e.password;
                        data.data = e;
                    }
                } else data = { code: 502, msg: '用户不存在' }
    
                res.send(data);
            }).catch(e => {
                res.send(e)
            });
        } else res.send(data);
    });
    
    // 添加
    router.post('/user/add', (req, res) => {
        const { body } = req;
        let data = tool.inspect(body, { account: '账号', username: '昵称' });
    
        if (data.code == 200) {
            body.password = tool.getMD5(body.account);
            db.sql('select * from admin where account = ?', body.account).then(e => {
                if (e) {
                    data = { code: 502, msg: '用户已存在' };
                    res.send(data);
                } else {
                    db.sql('insert into admin set ?', body).then(e => {
                        if (e) res.send(data);
                    }).catch(e => {
                        res.send(e)
                    });
                }
            }).catch(e => {
                res.send(e)
            });
        } else res.send(data);
    })
    
    // 修改
    router.post('/user/edit', (req, res) => {
        const { body } = req;
        let data = tool.inspect(body, { id: 'ID', username: '昵称' });
    
        if (data.code == 200) {
            db.sql('select * from admin where id = ?', body.id).then(e => {
                if (e) {
                    db.sql('update admin set ? where id = ?', [body, body.id]).then(e => {
                        if (e) res.send(data);
                    }).catch(e => {
                        res.send(e)
                    });
                } else {
                    data = { code: 502, msg: '用户不存在' };
                    res.send(data);
                }
            }).catch(e => {
                res.send(e)
            });
        } else res.send(data);
    })
    
    // 删除
    router.post('/user/delete', (req, res) => {
        const { body } = req;
        let data = tool.inspect(body, { id: 'ID' });
    
        if (data.code == 200) {
            db.sql('select * from admin where id = ?', body.id).then(e => {
                if (e) {
                    db.sql('delete from admin where id = ?', body.id).then(e => {
                        if (e) res.send(data);
                    }).catch(e => {
                        res.send(e)
                    });
                } else {
                    data = { code: 502, msg: '用户不存在' };
                    res.send(data);
                }
            }).catch(e => {
                res.send(e)
            });
        } else res.send(data);
    })
    
    module.exports = router

基于 MIT 许可发布