У меня есть экспресс-сервер, который обрабатывает запросы к базе данных сервера 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"
Как обойти эту проблему?Можно ли дождаться закрытия соединения или использовать существующее?