Обратный вызов журнала и запросы маршрутизатора, вызывающие проблемы параллелизма SQL Server в Express - PullRequest
0 голосов
/ 08 мая 2019

У меня есть экспресс-сервер, который обрабатывает запросы к базе данных сервера SQL Server.Для моих журналов я записываю все полученные запросы в таблицу журналов:

const morgan = require('morgan')
const stream = require('stream')
const DatabaseController = require('./dbcontroller')

const databaseStream = new stream.Writable()

// anything that is logged is passed to this stream... the text is logged
databaseStream.write = async (text) => {
  await DatabaseController.addLog({ text })
}
// remove the img binary from the body - which is too large

const logger = morgan( 'tiny', { immediate: true, stream: databaseStream })

module.exports = logger

Кроме того, можно сделать несколько запросов, которые также установят соединения с базой данных.

router.get('/logs', async (req, res, next) => {
  try {
    const logdata = await DatabaseController.getLogs()
    res.status(200)
    res.send({ logdata })
  } catch (err) { next(err) }
})

Нормальные запросы в порядке.Однако в любое время я делаю запрос, который требует подключения к базе данных (GET / logs).Я получаю следующее:

Глобальное соединение уже существует.Сначала вызовите sql.close ().

Реализация DatabaseController:

const sql = require('mssql')
const config = require('config')
const dconfig = config.database

const addLog = async (options) => {
  const { text, isError } = options
  try {
    let pool = await sql.connect(dconfig)
    let request = await pool.request()
    request.input('message', sql.Text, text.trim())
    if (isError) {
      request.input('iserr', sql.Bit, isError)
      await request.query('insert into dbo.MApp_Logs (message, is_error) values (@message, @iserr)')
    } else {
      await request.query('insert into dbo.MApp_Logs (message) values (@message)')
    }
  } catch (err) {
    throw err
  } finally {
    await sql.close()
  }
}
const getLogs = async () => {
  try {
    let pool = await sql.connect(dconfig)
    return await pool.request().query('SELECT * FROM dbo.MApp_Logs')
  } catch (err) {
    throw err
  } finally {
    await sql.close()
  }
}

Проблема в том, как есть.Я не могу помешать моему коду выполнить несколько соединений.При использовании пула соединений возникает следующая ошибка:

"message": "Уже подключено к базе данных! Вызовите соединение перед подключением к другой базе данных.", "Code": "EALREADYCONNECTING"

Как обойти эту проблему?Можно ли дождаться закрытия соединения или использовать существующее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...