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.');

注意

  1. 若在连接过程中出现报错: host '***' is not allowed to connect to this mysql server
    原因是 MySQL 不允许远程登录,解决方法如下:
  1. 登录MySQL: mysql -u root -p密码
  2. 执行 use mysql;
  3. 执行 update user set host = '%' where user = 'root'; 若有报错,忽略。
  4. 执行 FLUSH PRIVILEGES; 刷新MySQL的权限相关表。
  1. 若在连接过程中出现报错: 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 即可登陆。
  1. 登录MySQL: mysql -u root -p密码
  2. 执行 select user,plugin from user where user='root';,可发现加密方式是 caching_sha2_password
  3. 执行 select user,host from user; 查看root用户的可连接权限主机范围 host是'%'
  4. 执行 alter user 'root'@'%' identified with mysql_native_password by 'mysql登录密码'; 修改加密方式
  5. 再次执行第2步 加密方式已经改为 mysql_native_password
posted @ 2020-07-03 17:58  晨の风  阅读(228)  评论(0编辑  收藏  举报