node.js - 将 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));
这行得通吗?或者有没有传统上更好的方法来实现这个目标?
解决方案
您尝试这样做的方式将不起作用,因为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));
推荐阅读
- javascript - jVectorMap 在 onRegionClick 上双重执行
- javascript - 删除数组中的前缀 y 以将其用于图形的 ax 轴
- php - 更新到最新版本后已定义 Joomla 常量 _QQ_
- android - 在 LinearLayout 中将 TableLayout 居中
- java - Springboot组合安全(Oauth和form)配置
- php - PHP 关联数组的形成
- here-api - 来自 chrome 的 HERE Maps SSL 响应
- java - 我们可以使用 java 实现注册连续查询通知吗?如果是,那么如何?
- c - 使用堆栈将递归实现转换为迭代实现
- java - 类没有自动生成