在节点mysql超时

因为我们知道node有一些mysql模块,有些是纯js实现的(比如node-mysql ),有些是基于libmysql的。

我更喜欢node-mysql,因为它不需要额外的mysql库,看起来更“干净”。 但是我也注意到它不支持在连接和查询中的超时function,这可能会导致一些环境的问题。

所以我的问题是:有没有人干净地解决这个超时问题?

我们解决这个问题的方法是检查错误消息,并在必要时重新连接

这是他们如何在https://github.com/felixge/node-mysql#server-disconnects

这里是示例代码,以防文档发生变化

function handleDisconnect(connection) { connection.on('error', function(err) { if (!err.fatal) { return; } if (err.code !== 'PROTOCOL_CONNECTION_LOST') { throw err; } console.log('Re-connecting lost connection: ' + err.stack); connection = mysql.createConnection(connection.config); handleDisconnect(connection); connection.connect(); }); } handleDisconnect(connection); 

我有同样的问题,使用方法mysql.createPool而不是方法createConnection有我的工作。

这是我的代码;

 /*jslint node: true */ 'use strict'; var Q = require('q'); var mysql = require('mysql'); var _config; var env = process.env.NODE_ENV || 'development'; if (env === 'development') { _config = { host : 'localhost', user : 'root', charset : 'latin1', password : '123456', database : 'DEVDB', connectionLimit: 10 }; }else { _config = { host : 'PRODUCTIONHOST', user : 'root', charset : 'latin1', password : 'PRODUCTIONPASS', database: 'PRODUCTIONDB', connectionLimit: 10 }; } var _pool = mysql.createPool(_config); var runquery = function() { var deferred = Q.defer(); var args = Array.prototype.slice.call(arguments); //console.log(args); args.push(function(err, results){ if (err) { deferred.reject(new Error(err)); } else { deferred.resolve(results); } }); _pool.query.apply(_pool, args); return deferred.promise; }; module.exports = runquery; 

用法示例;

 runquery('select id from users where mail = ?', 'eugenioclrc') .then(function(rows){ console.log(rows); });