当前位置: 首页 > 面试题库 >

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

曾阳飙
2023-03-14
问题内容

我想将Node-mssql用作Node JS 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 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

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.jsroutes/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 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;
};


 类似资料:
  • 问题内容: 有没有办法在单个函数调用上做到这一点? 就像是: 我知道这是一个语法混乱,但是只是为了给我一个我想实现的目标一个思路,一系列路由就很棒了! 有人知道怎么做吗? 问题答案: 我在寻找相同功能时遇到了这个问题。 @Jonathan Ong在上面的评论中提到,不建议将数组用于路径,但已在Express 4中对其进行了明确描述,并且它在Express 3.x中有效。这是尝试的示例: 从对象内部

  • 问题内容: 我正在尝试编写一个多线程Python应用程序,其中在线程之间共享一个SQlite连接。我无法使它正常工作。真正的应用程序是一个小巧的Web服务器,但是以下简单代码演示了我的问题。 为了成功运行下面的示例代码,我需要进行哪些更改? 当我在THREAD_COUNT设置为1的情况下运行此程序时,它可以正常工作,并且数据库已按预期进行更新(即,字母“ X”被添加到SectorGroup列的文本

  • 这是否意味着我的整个应用程序只能连接到单个Kafka集群,或者KafkaStreams的每个实例只能连接到单个集群? 我可以创建多个连接到不同集群的具有不同属性的KafkaStreams实例吗?

  • 我的主文件app.js连接到userDB我想添加第二个数据库postsDB 常量mongoose=require(“mongoose”); 常量app=express(); mongoose.set(“UseCreateIndex”,true);mongoose.set(“UseUnifiedTopology”,true); Mongoose.connect(“MongoDB://localhos

  • 我正在制作一个实时多人游戏socket.io和node.js,我有一个html文件,运行一个公共脚本连接到服务器并运行命令,以及定义我需要的库

  • 我不知道如果我每次连接到远程服务器时都创建(新)一个引导程序,是否存在性能问题。所以我想使用一个单独的引导实例连接到多个服务器。我的代码如下: 不幸的是,它与: 至少,我应该使用相同的NioEventLoopGroup,对吗?