Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa menggunakan kumpulan koneksi mssql tunggal di beberapa rute dalam aplikasi web Express 4?

Sudah 3 tahun sejak saya bertanya dan menjawab pertanyaan itu. Sejak itu beberapa hal telah berubah. Inilah solusi baru berdasarkan ES6, mssql 4 dan Express 4 yang saya sarankan hari ini.

Dua elemen kunci berperan di sini.

  1. Modul di-cache setelah pertama kali dimuat. Ini berarti bahwa setiap panggilan ke require('./db') akan mengembalikan objek yang sama persis. Persyaratan pertama db.js akan menjalankan file itu dan membuat janji dan mengekspornya. Persyaratan kedua dari db.js akan mengembalikan janji yang sama tanpa menjalankan file. Dan janji itulah yang akan diselesaikan dengan kumpulan.
  2. Sebuah janji bisa ditepati lagi. Dan jika sudah teratasi sebelumnya akan segera teratasi kembali dengan apapun yang diselesaikan pertama kali yaitu pool.

Di 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}`)
})

Di 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
}

Di routes/set1.js dan 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

Untuk meringkas

Anda akan selalu mendapatkan janji yang sama karena caching modul dan janji itu akan, lagi dan lagi, diselesaikan dengan kumpulan yang diselesaikan dengan pertama kali. Jadi setiap file router menggunakan kumpulan yang sama.

BTW:ada cara yang lebih mudah untuk mencoba tangkapan di rute ekspres yang tidak akan saya bahas dalam jawaban ini. Baca tentang ini di sini:https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016

Solusi lama

Ini adalah solusi yang saya posting 3 tahun yang lalu, karena saya yakin saya memiliki jawaban yang layak untuk dibagikan dan saya tidak dapat menemukan solusi yang terdokumentasi di tempat lain. Juga dalam beberapa masalah (#118, #164, #165) di node-mssql topik ini dibahas.

Di 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);
});

Di 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 bernama instance dengan proyek Penginstal Visual Studio 2017

  2. Cara Membuat Rencana Eksekusi di SQL Server

  3. Cara Menangani Kesalahan dalam Transaksi Bersarang SQL Server

  4. Sisipkan Ke... Gabung... Pilih (SQL Server)

  5. Statistik Objek Database SQL Server