首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有异步/等待的node.js mysql池连接

带有异步/等待的node.js mysql池连接
EN

Stack Overflow用户
提问于 2018-02-06 00:11:20
回答 5查看 24.6K关注 0票数 7

有没有一种方法可以通过async/ await语法使用从mysqljs/mysql lib中提取的pool.getConnection()

其思想是有一个方法返回一个连接,该连接可以在释放它之前在具有各种外键约束(顺序查询)的写查询之间传递,同时潜在地从池中获得更多的连接,以用于各种读查询(并行)。

EN

回答 5

Stack Overflow用户

发布于 2018-06-01 06:39:20

分享我的工作示例:

我使用这个Promisified MySQL middleware for Node.js

阅读这篇文章Create a MySQL Database Middleware with Node.js 8 and Async/Await

这是我的database.js

代码语言:javascript
复制
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

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

必须使用async函数才能使用await。

示例:

代码语言:javascript
复制
   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)
       }
票数 13
EN

Stack Overflow用户

发布于 2018-02-06 00:34:45

伙计们。我不知道为什么,我试了一整天,但就是不能让它工作。在你的评论的帮助下,我再次尝试,它当然起作用了。

db.js:

代码语言:javascript
复制
const pool = mysql.createPool(config);

exports.getConnection = () => {
    return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
            if (err) {
                return reject(err);
            }
            resolve(connection);
        });
    });
};

someWhereElse.js:

代码语言:javascript
复制
const db = require('./db');

const wrappingFunction = async () => {
    const connection = await db.getConnection();
    console.log(connection);
};
wrappingFunction();
票数 3
EN

Stack Overflow用户

发布于 2019-10-07 17:52:06

看起来手动实现承诺是一个更好的选择。只是分享我在代码中用到的东西-

代码语言:javascript
复制
const mysql = require('mysql');
const config = require('config');

const pool = mysql.createPool(config.get('db.mysql'));

module.exports = {
    checkConnection: () => {
        return new Promise((resolve, reject) => {
            pool.getConnection((err, conn) => {
                if (err) {
                    return reject(err);
                }
                resolve(conn.release());
            });
        });
    },
    pool,
    closeConnection: () => pool.end(),
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48626761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档