我将express调用mysql分成了三个步骤
其中需要注意的是保障异步的等待环节,我这里使用了 mysql.createPool().promise() 和 async/await 。(注:.promise()方法需要mysql2)
1、首先是设置步骤,在/config/mysql.js中,连接数据库,并传入一个查询语句,返回一个回调const mysql = require ('mysql2')
// 这里为了方便连接不同的数据库,保留了database作为参数 const pool = (database) => mysql.createPool({ host: '', user: '', password: '', database }); // 需要传入我们连接的数据库名称,查询语句和一个后续操作的回调函数 exports.executeQuery = async (database ,query, callback) => { console.log("mysql 语句", query) const promisePool = pool(database).promise() try {
// 使用async/await确保查询完毕再返回结果 const [rows, fields] = await promisePool.query(query); console.log("config => rows:", rows)
// 记得关闭数据库连接 promisePool.end() return callback(rows) } catch (error) { throw new Error(`查询失败:${error.message}`); } }
2、第二步是模块步骤,/modules/database.js根据不同的请求生成不同的查询语句,同时也是在这一步指定需要查询的数据库
const { executeQuery } = require('../config/mysql') const database = 'database' exports.get = async(difficulty) => { console.log("查询排行榜数据") try {
// 根据变量调整查询语句 const query = `SELECT * from ranklist WHERE difficulty = ${difficulty} ORDER BY time ASC LIMIT 10;`
// 回调函数一般就是return结果,别忘记这个函数调用也要return 和 await return await executeQuery(database, query, (rows) => { console.log('callback', rows) return rows }) } catch (error) { console.error(error) throw error + ' 查询失败' } }
3、第三步则是路由上的设置,/routes/database.js中要这是请求方式和地址,同时处理请求和响应
const express = require('express')
let route = express.Router()
const databaseMoudle = require('../modules/database')
// 设置请求方式,path
route.post('/get',async (req,res) => { try {
// 直接把参数传给modules const result = await databaseMoudle.get(req.body.difficulty) console.log('result', result) const data = { code: 0, message: "成功获取难度"+ req.body.difficulty +"排行榜数据", data: result }
// 处理响应,返回结果 res.status(201).send(data) } catch (error) { console.error(error) res.status(500).send() } })
4、最后其实还有一步就是把database.js中的路由挂载到app上,这里我的做法是先在/routes/index.js中挂载各个database.js。然后在app.js中引用/routes/index.js
/routes/index.js // 这里也可以采用自动化的方法读取文件 const database = require('./database') module.exports = (app) => { app.use('/database',database) } app.js // 引入路由 const routes = require('./routes') routes(app)