Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да използвам единичен пул за връзки mssql през няколко маршрута в уеб приложение Express 4?

Изминаха 3 години, откакто попитах и ​​отговорих на въпроса. Оттогава няколко неща се промениха. Ето новото решение, базирано на ES6, mssql 4 и Express 4, което бих предложил днес.

Тук играят два ключови елемента.

  1. Модулите се кешират след първото им зареждане. Това означава, че всяко извикване на require('./db') ще върне точно същия обект. Първото изискване на db.js ще стартира този файл и ще създаде обещанието и ще го експортира. Второто изискване на 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.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

Да обобщим

Винаги ще получавате едно и също обещание поради кеширането на модули и това обещание отново и отново ще се разрешава с пула, което е решено с първия път. По този начин всеки файл на рутера използва един и същ пул.

BTW:има по-лесни начини за опитен улов в експресния маршрут, които няма да разглеждам в този отговор. Прочетете за това тук:https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016

Старото решение

Това е решението, което публикувах преди 3 години, защото вярвах, че имам отговор, който си струва да споделя и не можах да намеря документирано решение другаде. Също така в няколко броя (#118, #164, #165) на node-mssql тази тема се обсъжда.

В 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;
};


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Запазване на промените след редактиране на таблицата в SQL Server Management Studio

  2. SQL UPDATE оператор за превключване на две стойности в два реда

  3. Как да активирате ограничение CHECK в SQL Server (пример за T-SQL)

  4. Как работи функцията LEFT() в SQL Server (T-SQL)

  5. Как да свържете Python към SQL Server за автоматизиране на бекенд процес