node.js与async/await的mysql池连接

Sch*_*itz 5 mysql node.js async-await mysqljs

有没有办法使用pool.getConnection()mysqljs/mysql lib中的async/ await语法?

我们的想法是有一个方法返回一个连接,该连接可以在释放它之前在具有各种外键约束(顺序查询)的写查询中传递,同时可能从池中获得进一步的连接,以便进行各种读取查询(平行).

hoo*_*ogw 8

分享我的工作示例:

我将这个Promisified MySQL中间件用于Node.js

阅读本文使用Node.js 8和Async/Await创建MySQL数据库中间件

这是我的database.js

var mysql = require('mysql'); 

// node -v must > 8.x 
var util = require('util');


//  !!!!! for node version < 8.x only  !!!!!
// npm install util.promisify
//require('util.promisify').shim();
// -v < 8.x  has problem with async await so upgrade -v to v9.6.1 for this to work. 



// connection pool https://github.com/mysqljs/mysql   [1]
var pool = mysql.createPool({
  connectionLimit : process.env.mysql_connection_pool_Limit, // default:10
  host     : process.env.mysql_host,
  user     : process.env.mysql_user,
  password : process.env.mysql_password,
  database : process.env.mysql_database
})


// Ping database to check for common exception errors.
pool.getConnection((err, connection) => {
if (err) {
    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
        console.error('Database connection was closed.')
    }
    if (err.code === 'ER_CON_COUNT_ERROR') {
        console.error('Database has too many connections.')
    }
    if (err.code === 'ECONNREFUSED') {
        console.error('Database connection was refused.')
    }
}

if (connection) connection.release()

 return
 })

// Promisify for Node.js async/await.
 pool.query = util.promisify(pool.query)



 module.exports = pool
Run Code Online (Sandbox Code Playgroud)

您必须升级节点-v> 8.x.

你必须使用异步函数才能使用await.

例:

   var pool = require('./database')

  // node -v must > 8.x, --> async / await  
  router.get('/:template', async function(req, res, next) 
  {
      ...
    try {
         var _sql_rest_url = 'SELECT * FROM arcgis_viewer.rest_url WHERE id='+ _url_id;
         var rows = await pool.query(_sql_rest_url)

         _url  = rows[0].rest_url // first record, property name is 'rest_url'
         if (_center_lat   == null) {_center_lat = rows[0].center_lat  }
         if (_center_long  == null) {_center_long= rows[0].center_long }
         if (_center_zoom  == null) {_center_zoom= rows[0].center_zoom }          
         _place = rows[0].place


       } catch(err) {
                        throw new Error(err)
       }
Run Code Online (Sandbox Code Playgroud)

  • 连接释放怎么样 (2认同)
  • @MohammadMaroofMalik 连接将在使用后自动释放回池中。请参阅此处(https://medium.com/@matthagemann/create-a-mysql-database-middleware-with-node-js-8-and-async-await-6984a09d49f4) (2认同)

Dan*_*rin 0

当然,你必须首先承诺它,从node 8.0.0现在开始你可以这样做:

const util = require('util');

async function doSomething() {
     const getConnectionAsync = util.promisify(pool.getConnection);
   try {
       const result = await getConnectionAsync('MASTER');
    }catch(err) {
       console.log('Oh no');
    }
} 
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你不能使用 Node 8 或更高版本,还有其他方法可以 Promisify 它,例如http://bluebirdjs.com/docs/api/promise.promisify.html