之前写过springboot整合mysql,但自己是搞前端的,所以还是想着用Js去写后端,于是就有了Express与Mysql整合的想法。做的时候没用express生成器,一点一点写的,毕竟只是学习嘛,没那么讲究。废话不多说,下面进入正题。
创建一个空文件夹并进入,执行 npm init -y 创建一个node项目。
npm init -y
此时文件夹下会生成一个package.json文件。
里面有个main属性,对应的值就是你要运行的js文件,默认叫index,我的给它改成了app,如下:
"main": "app.js"
安装依赖 express、 mysql
npm i express
npm i mysql
在根目录下,创建一个app.js文件,一个controller目录,一个service目录,一个static目录。
在app.js里引入express,使用express里的json等中间件来处理json数据等等,最后监听指定的端口号,如下:
const express = require('express')
const app = express()
const userController = require('./controller/user-controller/index')
app.use(express.json())
app.use(express.urlencoded())
app.use('/user', userController)
app.listen('9090', () => {
console.log('NodeJs后端服务器启动成功')
})
app.use(‘/user’, userController),这个用来处理对应的路由。接下来咋弄,直接放代码了。
控制层:
const express = require('express')
const router = express.Router()
const userService = require('../../service/user-service/index')
router.get('/listUser', (req, res) => {
userService.listUser(req, res)
})
module.exports = router
它调用了service层,service层如下:
const mysql = require('../../static/js/mysql/index')
module.exports.listUser = (req, res) => {
let sql = 'select * from user'
let value = []
mysql.query(sql, value, (row) => {
res.json(row)
})
}
它调用了mysql,mysql代码如下:
const mysql = require('mysql')
const util = require('../util/inex')
const pool = mysql.createPool({
host: '127.0.0.1',
port: '3306',
user: 'root',
password: 'password',
database: '你要连接的数据名字',
connectionLimit: 50, //用于指定连接池中最大的链接数,默认属性值为10.
queueLimit: 3 //用于指定允许挂起的最大连接数,如果挂起的连接数超过该数值,就会立即抛出一个错误,默认属性值为0.代表不允许被挂起的最大连接数。
})
module.exports.query = (sql, value, callback) => {
pool.getConnection((err, connection) => {
if (err) {
console.log('数据库连接失败')
pool.releaseConnection() //释放链接
let error = {
code: '500',
message: '数据库连接失败'
}
callback(error)
} else {
connection.query(sql, value, (err, row) => {
if (err) {
console.log('sql语句执行失败,没有找到指定的结果')
connection.release() //释放链接
let error = {
code: '500',
message: 'Sql语句执行失败,没有找到指定的结果'
}
callback(error)
} else {
connection.release()
if (row instanceof Array) {
let response = {
code: '200',
date: util.toHump(row)
}
callback(response)
} else {
let response = {
code: '200',
data: []
}
callback(response)
}
}
})
}
})
}
里面有个toHump方法,我表里的字段使用小写接下划线的,但是返回给前台的时候想转换成驼峰的,所以写了个工具方法,如下:
// 下划线转驼峰
module.exports.toHump = (array) => {
let toHump = (key) => {
return key.replace(/\_(\w)/g, function (all, letter) {
return letter.toUpperCase();
})
}
let tempArray = []
for (let i of array) {
let obj = {}
for (let j of Object.keys(i)) {
obj[toHump(j)] = i[j]
}
tempArray.push(obj)
}
return tempArray
}
最后的最后,运行app.js文件,直接 node app.js (后缀可以省略)。运行完毕,去浏览器访问接口,就能看到相应的数据了。
顺带提一下,这有个缺点。就是每改一次代码就要重启一次,所以我用nodemon启动。首先全局安装nodemon,我装的2.0.0版本,最新版本在用的时候好像会报错,不知道啥原因所致(难道node版本低了?我之前用16.16.0的版本貌似也出错,郁闷啊。。。)。安装好之后,直接 nodemon app.js就可以了。
全局安装 nodemon,如下:
npm i nodemon@2.0.0 -g
特此记录!