私は、express.jsのルート間で(node-mysqlを使用して)mysql接続を渡す最良の方法を見つけようとしています。私は各ルートを動的に追加しています(ルートのfor eachファイルループを使用しています)。つまり、それを必要とするルートへの接続を単に渡すことはできません。すべてのルートに渡すか、まったく渡さないかのどちらかです。それを必要としないものに渡すという考えは好きではなかったので、必要に応じてルートが個別にインポートできるdbConnection.jsを作成しました。問題は、私が正しく行っているとは思わないことです。現在、私のdbConnection.jsには以下が含まれています。
var mysql = require('mysql');
var db = null;
module.exports = function () {
if(!db) {
db = mysql.createConnection({
socketPath: '/tmp/mysql.sock',
user: '*********',
password: '*********',
database: '**********'
});
}
return db;
};
そして私はそれを各ルートにインポートしています:
var db = require('../dbConnection.js');
var connection = new db();
しかし、私はこのようにしたいと思います:
var connection = require('../dbConnection.js');
しかし、このようにしようとすると、クエリを実行しようとすると接続にメソッド 'query'がないというエラーが表示されます。
Node-mysqlのプールオブジェクトを使用するほうが信頼できると思います。これが私の設定方法です。データベース情報には環境変数を使用しています。リポジトリから除外します。
var mysql = require('mysql');
var pool = mysql.createPool({
Host: process.env.MYSQL_Host,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASS,
database: process.env.MYSQL_DB,
connectionLimit: 10,
supportBigNumbers: true
});
// Get records from a city
exports.getRecords = function(city, callback) {
var sql = "SELECT name FROM users WHERE city=?";
// get a connection from the pool
pool.getConnection(function(err, connection) {
if(err) { console.log(err); callback(true); return; }
// make the query
connection.query(sql, [city], function(err, results) {
connection.release();
if(err) { console.log(err); callback(true); return; }
callback(false, results);
});
});
};
var db = require('../database');
exports.GET = function(req, res) {
db.getRecords("San Francisco", function(err, results) {
if(err) { res.send(500,"Server Error"); return;
// Respond with results as JSON
res.send(results);
});
};
new db()の代わりにdb()を使用するとソリューションが機能し、db接続ではなくオブジェクトを返します
var db = require('../dbConnection.js');
//var connection = new db();
var connection = db();