Node.js 将mysql连接作为参数传递给表达式路由中间件函数 我想知道是否可以将连接的数据库实例作为参数传递给express中间件。 例如:

Node.js 将mysql连接作为参数传递给表达式路由中间件函数 我想知道是否可以将连接的数据库实例作为参数传递给express中间件。 例如:,node.js,express,database-connection,middleware,Node.js,Express,Database Connection,Middleware,然后在另一个文件中 // 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

然后在另一个文件中

// 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));

这样行吗?还是有一种传统上更好的方法来实现这一目标?

您尝试的方法行不通,因为
req,res
将是未定义的

但是,您可以创建一个工厂函数,将连接作为参数,并返回路由处理程序函数。由于将返回的函数是一个闭包,因此它可以访问父作用域中的db连接。比如:

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));
或者,如果您不想/不需要创建自己的factory函数,您可以简单地执行以下操作:

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

我需要研究工厂的功能是什么;不管怎样,如果我像这样提供请求和响应对象,下面的代码可以工作吗<代码>app.get('/login',(req,res)=>loginHanlder(req,res,mysqlCon))对于返回另一个函数的函数来说,这只是一个花哨的名称:)是的,这样应该可以工作。基本上和我做的一样。
app.get('/login', (req, res) => loginHandler(req, res, mysqlCon));