Node 搭建项目

创建项目

  1. 创建空文件夹

  2. 在终端执行

    1
    npm init

安装包

1
2
3
4
5
6
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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    const express = require('express');
    const cors = require('cors');
    const bodyParser = require('body-parser');
    const app = express();

    app.use(cors({
    origin: ['http://localhost:8080']
    }))
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({
    extended: false,
    type: "application/x-www-form-urlencoded",
    }))
    app.use(require('./router/user'));

    app.listen(3001, () => {
    console.log('服务器请求成功:http://localhost:3001');
    })
  3. 代码注释

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

目录结构

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

  2. /utils:工具类目录。

    • 数据库工具类:db.js

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    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