首页 > 解决方案 > 将 mysql 连接作为参数传递给表达式路由中间件函数

问题描述


我想知道是否可以将连接的数据库实例作为参数传递给快速中间件。
例如:
// in app.js
const mysql = require('mysql');
const mysqlCon = mysql.createConnection({
  // some configurations...
})
mysqlCon.connect((err)=> if(err) throw err);

然后在一个单独的文件中......

// in a separate file called: login handler
const loginHandler = (req, res, dbCon) => {
  // query database and stuff...
} 
module.exports = loginHanlder;

然后返回 app.js 将已建立的 mysql 连接传递给中间件处理程序

// back in app.js
// a route
const loginHandler = require('./handlers/loginHanlder.js');
app.get('/login', loginHanlder(req, res, mysqlCon));

这行得通吗?或者有没有传统上更好的方法来实现这个目标?

标签: node.jsexpressdatabase-connectionmiddleware

解决方案


您尝试这样做的方式将不起作用,因为req,res将是未定义的。

但是,您可以创建一个工厂函数,将连接作为参数并返回路由处理程序函数。由于将返回的函数是一个闭包,因此它将可以访问父范围内的 db-connection。就像是:

function getRequestHandler(dbConn) {
        return function (req, res, next) {
            // use dbConn here to do stuff
        }
}

你可以像这样使用它:

const dbConn = initConnection(); // connect to your db here and return the connection instance
app.get('/login', getRequestHandler(dbConn));

或者,如果您不想/不需要创建自己的工厂函数,您可以简单地执行以下操作:

app.get('/login', (req, res) => loginHandler(req, res, mysqlCon));

推荐阅读