我想将Node-mssql用作Node JS Express 4 Web应用程序中的MSSQL数据库连接器。路由处理程序逻辑在单独的文件中处理。
如何创建单个/全局连接池,并在处理路由逻辑的多个文件中使用它?我不想在每个路由处理程序功能/文件中建立新的连接池。
自问和回答问题以来已经三年了。从那以后,一些事情发生了变化。这是我今天建议的基于ES6,mssql 4和Express 4的新解决方案。
这里有两个关键要素。
在 server.js
server.js
const express = require('express') // require route handlers. // they will all include the same connection pool const set1Router = require('./routes/set1') const set2Router = require('./routes/set2') // generic express stuff const app = express() // ... app.use('/set1', set1Router) app.use('/set2', set2Router) // No need to connect the pool // Just start the web server const server = app.listen(process.env.PORT || 3000, () => { const host = server.address().address const port = server.address().port console.log(`Example app listening at http://${host}:${port}`) })
在 db.js
db.js
const sql = require('mssql') const config = {/*...*/} const poolPromise = new sql.ConnectionPool(config) .connect() .then(pool => { console.log('Connected to MSSQL') return pool }) .catch(err => console.log('Database Connection Failed! Bad Config: ', err)) module.exports = { sql, poolPromise }
在routes/set1.js和routes/set2.js
routes/set1.js
routes/set2.js
const express = require('express') const router = express.Router() const { poolPromise } = require('./db') router.get('/', async (req, res) => { try { const pool = await poolPromise const result = await pool.request() .input('input_parameter', sql.Int, req.query.input_parameter) .query('select * from mytable where id = @input_parameter') res.json(result.recordset) } catch (err) { res.status(500) res.send(err.message) } }) module.exports = router
总结一下
由于模块缓存,您将始终获得相同的承诺,并且该承诺将一次又一次地使用其第一次解析的池进行解析。因此,每个路由器文件使用相同的池。
顺便说一句:在快速路线中,有一些更简单的方法可以尝试尝试,而我在此答案中不会涉及。在此处阅读有关内容:https : //medium.com/@Abazhenov/using-async-await-in-express-with- node-8-b8af872c0016
旧的解决方案
这是我3年前发布的解决方案,因为我认为我有一个值得分享的答案,而且在其他地方也找不到文档记录的解决方案。同样在node-mssql 的一些问题(#118,#164和#165)中,也讨论了该主题。
var express = require('express'); var sql = require('mssql'); var config = {/*...*/}; //instantiate a connection pool var cp = new sql.Connection(config); //cp = connection pool //require route handlers and use the same connection pool everywhere var set1 = require('./routes/set1')(cp); var set2 = require('./routes/set2')(cp); //generic express stuff var app = express(); //... app.get('/path1', set1.get); app.get('/path2', set2.get); //connect the pool and start the web server when done cp.connect().then(function() { console.log('Connection pool open for duty'); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); }); }).catch(function(err) { console.error('Error creating connection pool', err); });
在 routes/set1.js
var sql = require('mssql'); module.exports = function(cp) { var me = { get: function(req, res, next) { var request = new sql.Request(cp); request.query('select * from test', function(err, recordset) { if (err) { console.error(err); res.status(500).send(err.message); return; } res.status(200).json(recordset); }); } }; return me; };