问题描述
我想知道是否可以将连接的数据库实例作为参数传递给快速中间件。
例如:
// 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));