nodejs+express+mySql实现简单的接口并封装

1,201 阅读3分钟
前提:前提:
  • 有代码基础
  • 安装node、mySql、最好再加个postman,方便接口调试,下载方式此处省略
  • 创建数据库,并且添加数据库表和记录,以下不多赘述,数据库最终所需数据附图,下图中usermsg表可忽略

image.png 一、安装好node+mySql之后,在创建的目录文件夹下打开命令窗口,执行npm init,会自动生成一个package.json文件,然后再执行,:

   npm install express
   npm install body-parser
   npm install cors --save

二、在node文件夹下新建一个文件app.js(即入口文件),同时为了后续的代码更轻便整洁,最好是在搭建项目时最好就考虑好模块化,新建四个文件夹Model、Router、Controller、Until。

入口文件app.js代码如下,注释都在代码段里

const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser'); //解析参数用的
const userRouter = require('./Router/userRouter');

app.use(cors()); // 解决跨域
app.use(bodyParser.json()) // json请求
app.use(bodyParser.urlencoded({ extended: false })) // 表单请求
app.all('*',(req,res,next) => {
    // 设置允许跨域的域名,*代表允许任意域名跨域
    res.header('Access-Control-Allow-Origin','*')
    // 允许的header类型
    res.header('Access-Control-Allow-Headers','content-type');
    // 跨域允许的请求方式
    res.header('Access-Control-Allow-Methods','DELETE,PUT,POST,GET,OPTIONS')
    // 在请求的回调函数汇中遇见next(),就会继续执行后面的代码
    next()
})

app.use('/user',userRouter)

app.listen(80, () =>{
    console.log('80端口启动!')
})

Model文件夹下新建文件userMedel.js,主要是处理数据库的操作命令和方法调用

const {db} = require('../Util/mySql');

// 通过用户名查询对应数据
exports.getUname = (res,username) =>{
    let sql = 'SELECT * FROM user WHERE username = ?'
    let data = db(sql, res, [username])
    return data;
}

controller文件夹下新建文件userContrller.js,处理请求数据库后的数据回调

const userModel = require('../Model/userModel');
const { Result } = require('../Util/mySql')

exports.handleLogin = async (req, res) => {
    let { username, password } = req.query;
    let $data = await userModel.getUname(res, username);

    // 判断用户名不能为空
    if (!username) {
        return res.send(new Result({ msg: '用户名不能为空' }))
    }

    // 判断用户是否存在
    if ($data.length === 0) { 
        return res.send(new Result({ msg: '用户名不存在' }))
    }

    // 判断密码是否正确
    if (password != $data[0].password) {
        return res.send(new Result({ msg: '密码错误' }))
    }

    // 登录成功
    return  res.send(new Result({ msg: '登录成功',data:$data }))
}

Router文件夹下新建文件userRouter.js,用来配置接口路由

const express = require('express');
const userRouter = express.Router();

// 导入 userController
const userController = require('../Controller/userController');

// 登录
userRouter.get('/login', userController.handleLogin)

module.exports = userRouter;

Until文件夹下新建文件mySql.js,创建数据库连接池并连接,此处也可以使用mysql.createConnection方法来创建,但是考虑到建立一个数据库连接所消耗的性能成本是很高的,在服务器应用程序中,如果为每一个接收到的客户端都建立一个或多个数据库连接,将严重的降低应用程序性能,所以一步到位,直接使用连接池mysql.createPool。

const mysql = require('mysql');
// 以下信息是你的数据库信息
const option = {
    host: '127.0.0.1',
    user: 'root',
    password: 'Aa123456',
    port: '3306',
    database: 'new_datadbase',
    connectTimeout: 5000, // 连接超时
    multipleStatements: true // 支持执行多条 sql 语句
}

let pool;
repool();

function repool() { // 断线重连机制,每隔3s重连一次
    pool = mysql.createPool({ // 创建连接池
        ...option,
        waitForConnections: true, // 当无连接池可用时,等待(true)还是报错(false)
        connectionLimit: 100, // 连接数限制
        queueLimit: 0  // 最大连接等待数(0为不限制)
    })
    pool.on('error', err => err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 3000))
}

let db = function (sql, res, params = []) {
    return new Promise((resolve, reject) => {
        // 一、创建一个连接池,也就是上面的pool
        // repool();
        // 二、连接
        pool.getConnection((err, connection) => {
            // 三、使用sql语句操作
            connection.query(sql, params, (err, results) => {
                if (err) {
                    // res是调用接口时,如果执行mysql执行出错,直接返回报错信息
                    let $errData = {
                        code: 500,
                        msg: `服务器内部错误${err.message}`,
                        data: null
                    }
                    return res.json(new Result($errData));
                } else {
                    // return res.json(new Result({ data: results }))
                    resolve(results)
                }
                // 释放连接池
                connection.release();
            })
        })
    })
}

function Result({ code = 200, msg = '成功', data = null }) {
    this.code = code;
    this.msg = msg;
    this.data = data;
}

module.exports = { db, Result } 

三、启动接口,node app.js, 接口启动成功,但由于node在更改代码后需要每次重启才会刷新,可以下载个可自动刷新的配置,我这里用得是hotnode,下载命令npm install hotnode,下载后更改package.json里的start为hotnode app.js,然后在命令行内运行即可,启动后可以通过http://localhost:80/user/login?username=admin&password=123456 去访问接口,也可以在postman中调试

image.png 最终接口返回:

image.png ok,到此一个简单的接口就实现了-。-