Is there a way to use pool.getConnection() taken from the mysqljs/mysql lib with the async/ await syntax?

The idea is to have a method which returns one connection which can be passed around amongst write queries with various foreign key constraints (sequential queries) before releasing it and at the same time potentially get further connections from the pool for the purpose of various read queries (parallel).

解决方案

Share my working example:

here is my 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

You must upgrade node -v > 8.x

you must use async function to be able to use await.

example:

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)

}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐