Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào tôi có thể sử dụng một nhóm kết nối mssql duy nhất trên nhiều tuyến đường trong ứng dụng web Express 4?

Đã 3 năm kể từ khi tôi hỏi và trả lời câu hỏi. Kể từ đó, một số điều đã thay đổi. Đây là giải pháp mới dựa trên ES6, mssql 4 và Express 4 mà tôi sẽ đề xuất hôm nay.

Hai yếu tố chính đang diễn ra ở đây.

  1. Các mô-đun được lưu vào bộ nhớ đệm sau lần đầu tiên chúng được tải. Điều này có nghĩa là mọi lệnh gọi request ('./ db') sẽ trả về chính xác cùng một đối tượng. Yêu cầu đầu tiên của db.js sẽ chạy tệp đó và tạo lời hứa và xuất nó. Yêu cầu thứ hai của db.js sẽ trả về cùng một lời hứa mà không cần chạy tệp. Và đó là lời hứa sẽ thành công với nhóm.
  2. Một lời hứa có thể được chứng minh một lần nữa. Và nếu nó đã được giải quyết trước đó, nó sẽ ngay lập tức giải quyết lại với bất cứ thứ gì nó đã giải quyết với lần đầu tiên, đó là nhóm.

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

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

Trong 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

Tóm tắt

Bạn sẽ luôn nhận được cùng một lời hứa do bộ nhớ đệm mô-đun và lời hứa đó sẽ lặp đi lặp lại, giải quyết với nhóm mà nó đã giải quyết trong lần đầu tiên. Do đó, mỗi tệp bộ định tuyến sử dụng cùng một nhóm.

BTW:Có nhiều cách dễ dàng hơn để đi thử trong tuyến đường cao tốc mà tôi sẽ không đề cập trong câu trả lời này. Đọc về nó tại đây:https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016

Giải pháp cũ

Đây là giải pháp tôi đã đăng cách đây 3 năm, bởi vì tôi tin rằng tôi đã có một câu trả lời đáng để chia sẻ và tôi không thể tìm thấy một giải pháp được tài liệu hóa ở nơi khác. Ngoài ra, trong một số vấn đề (# 118, # 164, # 165) tại node-mssql, chủ đề này sẽ được thảo luận.

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

Trong 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. Khi nào / Tại sao sử dụng Cascading trong SQL Server?

  2. Mẫu thiết kế cho các trường tùy chỉnh trong cơ sở dữ liệu quan hệ

  3. Cách sửa đổi thời gian lưu giữ dữ liệu thu thập dữ liệu thay đổi (CDC) trong SQL Server - Hướng dẫn sử dụng SQL Server

  4. Truy vấn SQL Server Xml với nhiều không gian tên

  5. Tách các giá trị được phân tách trong một cột SQL thành nhiều hàng