Как правильно передать соединение mysql на маршруты с помощью express.js

Я пытаюсь найти лучший способ передать соединение mysql (используя node-mysql) между моими маршрутами для express.js. Я динамически добавляю каждый маршрут (используя цикл для каждого файла в маршрутах), что означает, что я не могу просто передать соединение на маршруты, которые в нем нуждаются. Мне либо нужно передать его каждому маршруту, либо вообще никому. Мне не нравилась идея передавать его тем, кому он не нужен, поэтому я создал 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');

Однако, когда я пытаюсь сделать это таким образом, я получаю сообщение об ошибке, говорящее, что соединение не имеет метода «запрос», когда я пытаюсь сделать запрос.


person anonymousfox    schedule 28.05.2013    source источник
comment
Возможный дубликат Express — передача подключения mysql к сценариям   -  person Gntem    schedule 29.03.2016


Ответы (2)


Я считаю более надежным использовать объект пула node-mysql. Вот как я настроил свой. Я использую переменную среды для информации о базе данных. Держит его вне репо.

база данных.js

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);
  });
};
person Daniel    schedule 28.05.2013
comment
Спасибо за решение. Не могли бы вы подробнее рассказать о размещении запросов в папке базы данных? Я относительно новичок в узле, и мне сложнее делать то, что я хочу, асинхронно. - person anonymousfox; 29.05.2013
comment
Просто из любопытства, почему вам не нужно освобождать соединение обратно в пул в getRecords? Кажется, что connectionLimit будет срабатывать после 10 запросов? - person jczaplew; 31.07.2014
comment
На самом деле, я пропустил это. Вставлю это туда. Спасибо за замечание. - person Daniel; 01.08.2014

ваше решение будет работать, если вы используете db() вместо new db(), который возвращает объект, а не соединение с db

var db = require('../dbConnection.js');
//var connection = new db();
var connection = db();
person Banditvibe    schedule 05.01.2014