web-dev-qa-db-fra.com

Comment passer correctement la connexion mysql aux routes avec express.js

J'essaie de trouver le meilleur moyen de passer une connexion mysql (en utilisant node-mysql) entre mes routes pour express.js. J'ajoute dynamiquement chaque route (en utilisant un pour chaque boucle de fichier dans les routes), ce qui signifie que je ne peux pas simplement passer la connexion aux routes qui en ont besoin. J'ai besoin de le transmettre à chaque itinéraire ou pas du tout. Je n'aimais pas l'idée de le transmettre à ceux qui n'en ont pas besoin, j'ai donc créé un dbConnection.js que les itinéraires peuvent importer individuellement s'ils en ont besoin. Le problème est que je ne pense pas le faire correctement. Pour l'instant, mon dbConnection.js contient:

var mysql = require('mysql');
var db = null;
module.exports = function () {
    if(!db) {
            db = mysql.createConnection({
                socketPath: '/tmp/mysql.sock',
            user: '*********',
            password: '*********',
            database: '**********'
        });
    }
    return db;
};

Et je l'importe dans chaque route en utilisant:

var db = require('../dbConnection.js');
var connection = new db();

Mais je voudrais le faire comme ceci:

var connection = require('../dbConnection.js');

Cependant, lorsque j'essaye comme ceci, j'obtiens une erreur indiquant que la connexion n'a pas de méthode "requête" lorsque j'essaie de faire une requête.

25
anonymousfox

Je trouve plus fiable d'utiliser l'objet pool de node-mysql. Voici comment j'ai configuré le mien. J'utilise une variable d'environnement pour les informations de base de données. Le garde hors du repo.

database.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);
    });
  });
};

Route

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);
  });
};
52
Daniel

votre solution fonctionnera si vous utilisez db () au lieu de new db (), qui retourne un objet et non la connexion db

var db = require('../dbConnection.js');
//var connection = new db();
var connection = db();
1
Banditvibe