如何在Express 4 Web应用程序的多个路由中使用单个mssql连接池?

如何在Express 4 Web应用程序的多个路由中使用单个mssql连接池?,第1张

如何在Express 4 Web应用程序的多个路由中使用单个mssql连接池?

自问和回答问题以来已经三年了。从那以后,一些事情发生了变化。这是我今天建议的基于ES6,mssql 4和Express 4的新解决方案

这里有两个关键要素。

  1. 第一次加载模块后将对其进行缓存。这意味着每次对require(’./ db’)的调用都将返回完全相同的对象。db.js的第一个需求将运行该文件并创建promise并将其导出。db.js的第二个要求将在不运行文件的情况下返回相同的承诺。而这个承诺将与池一起解决。
  2. 诺言可以再次得到证实。如果以前解决过,它将立即使用第一次解决的结果即池立即再次解决。

server.js

const express = require('express')// require route handlers.// they will all include the same connection poolconst set1Router = require('./routes/set1')const set2Router = require('./routes/set2')// generic express stuffconst app = express()// ...app.use('/set1', set1Router)app.use('/set2', set2Router)// No need to connect the pool// Just start the web serverconst 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

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

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)中,也讨论了该主题。

server.js

var express = require('express');var sql     = require('mssql');var config  = {};//instantiate a connection poolvar cp      = new sql.Connection(config); //cp = connection pool//require route handlers and use the same connection pool everywherevar set1    = require('./routes/set1')(cp);var set2    = require('./routes/set2')(cp);//generic express stuffvar app = express();//...app.get('/path1', set1.get);app.get('/path2', set2.get);//connect the pool and start the web server when donecp.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;};


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5126675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存