CentOS 环境 Node + Koa2 连接 MySQL (ECS系列三)
Koa 搭建服务
新建一个文件夹 koa_server,进入后
cnpm i -S koa
会生成 node_modules 依赖包,以及 package.json
创建文件 server.js,并写入
const Koa = require('koa');
const app = new Koa();
app.use( async ( ctx ) => {
ctx.body = 'hello koa2'
})
app.listen(3000)
console.log('app running at port 3000.');
运行 node server.js
即可,这是最简单的http服务。
在ecs安全组,提前开放 3000 端口访问权限。
浏览器中打开 localhost:3000 就能看到 koa 已经在运行。
然后可以加入中间件(middleware)
const Koa = require('koa');
const app = new Koa();
// logger
app.use(async (ctx, next)=>{
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ${ctx.url} - ${rt}`)
})
// x-response-time
app.use(async (ctx, next)=>{
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`)
})
app.use( async ( ctx ) => {
ctx.body = 'hello koa2'
})
app.listen(3000)
console.log('app running at port 3000.');
关于中间件,此处不再展开。
koa 相关内容,可参考 Koa 2
安装 MySQL 连接库
cnpm i -S mysql
创建文件 mysql/index.js
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'MySQL主机地址',
user : 'root',
password : 'MySQL登录密码',
database : 'MySQL数据库'
});
class Mysql {
query (param) {
return new Promise((resolve, reject) => {
// user 数据表中查询 user_name 为 param 的数据
connection.query(
`SELECT * from user WHERE user_name='${param}'`,
function (error, results, fields) {
if (error) {
return reject(error)
};
resolve(results)
});
})
}
}
module.exports = new Mysql()
这样的配置,可以短期连接,在实际开发中,mysql连接会经常掉线。在这里,引入连接池,改写如下:
var mysql = require('mysql');
var pool = mysql.createPool({
host : 'MySQL主机地址',
user : 'root',
password : 'MySQL登录密码',
database : 'MySQL数据库'
});
class Mysql {
connect(){
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
console.log("连接失败");
reject(err)
} else {
resolve(connection)
}
})
})
}
async query (param) {
let connection = await this.connect()
return new Promise((resolve, reject) => {
// user 数据表中查询 user_name 为 param 的数据
connection.query(`SELECT * from user WHERE user_name='${param}'`,(error, results)=>{
if (error) {
return reject(error)
};
resolve(results)
});
//释放
connection.release();
})
}
}
module.exports = new Mysql()
然后在 server.js 中引用
const Koa = require('koa');
const app = new Koa();
const mysql = require('./mysql/index');
// logger
app.use(async (ctx, next)=>{
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ${ctx.url} - ${rt}`)
})
// x-response-time
app.use(async (ctx, next)=>{
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`)
})
app.use(async (ctx) => {
let data = await mysql.query()
ctx.body = {
"code": 10,
"data": data,
"mesg": 'ok'
}
})
app.listen(3000)
console.log('app running at port 3000.');
注意
- 若在连接过程中出现报错:
host '***' is not allowed to connect to this mysql server
原因是 MySQL 不允许远程登录,解决方法如下:
- 登录MySQL: mysql -u root -p密码
- 执行
use mysql;
- 执行
update user set host = '%' where user = 'root';
若有报错,忽略。 - 执行
FLUSH PRIVILEGES;
刷新MySQL的权限相关表。
- 若在连接过程中出现报错:
Client does not support authentication protocol requested by server; consider upgrading MySQL client
原因是 MySQL8 之前的版本中加密规则是mysql_native_password
,而在 MySQL8 之后,加密规则是caching_sha2_password
,客户端中找不到新的身份验证插件caching_sha2_password
因而报错。我们将 MySQL 的登录密码加密规则还原成mysql_native_password
即可登陆。
- 登录MySQL: mysql -u root -p密码
- 执行
select user,plugin from user where user='root';
,可发现加密方式是caching_sha2_password
- 执行
select user,host from user;
查看root用户的可连接权限主机范围 host是'%' - 执行
alter user 'root'@'%' identified with mysql_native_password by 'mysql登录密码';
修改加密方式 - 再次执行第2步 加密方式已经改为
mysql_native_password