【问题标题】:How to properly pass mysql connection to routes with express.js如何使用 express.js 正确地将 mysql 连接传递给路由
【发布时间】:2013-05-23 22:02:20
【问题描述】:

我正在尝试找出在我的 express.js 路由之间传递 mysql 连接(使用 node-mysql)的最佳方式。我正在动态添加每条路由(在路由中使用 for each file 循环),这意味着我不能只将连接传递给需要它的路由。我要么需要将它传递给每条路线,要么根本不需要。我不喜欢将它传递给不需要它的人的想法,所以我创建了一个 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');

但是,当我这样尝试时,当我尝试进行查询时,我收到一条错误消息,提示连接没有方法“查询”。

【问题讨论】:

标签: node.js express node-mysql


【解决方案1】:

我发现使用 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);
  });
};

【讨论】:

  • 感谢您的解决方案。您能否详细说明将查询放入数据库文件夹中?我对节点比较陌生,我发现异步做我想做的事更难。
  • 只是出于好奇,为什么不需要将连接释放回getRecords 中的池?似乎connectionLimit 会在 10 个请求后被命中?
  • 你确实做到了,我错过了。会把它放在那里。感谢您的来信。
【解决方案2】:

如果使用 db() 而不是 new db(),您的解决方案将起作用,它返回一个对象而不是 db 连接

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2023-04-03
    • 2021-04-12
    • 2011-12-05
    • 2019-11-05
    相关资源
    最近更新 更多