将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,mysqlCon));

这项工作有效吗?还是有传统上更好的方法来实现这一目标?

解决方法

您尝试执行此操作的方式将无效,因为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,mysqlCon));

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...