Отсутствие отдельного подключения (сеанс/процесс бд) для каждого юзера системы node.js mysql2 express
Объясните пожалуйста как это работает? Есть подключение к базе данных (database.js)
const { createPool } = require('mysql2')
const { database } = require('./app.config.json')
let db = createPool(database)
module.exports = db
app.config.json:
{
"database": {
"host": "192.168.0.200",
"user": "user_oem_test",
"password": "12345678",
"database": "oem_db_test",
"connectionLimit": 10,
"dateStrings": true,
"multipleStatements": true,
"waitForConnections": true,
"queueLimit": 0
},
"port": 5000
}
запросы происходят через model, соntroller, router
models/monitor.js:
const { json } = require('body-parser')
const { promise } = require('../database')
const db = require('../database')
const { options } = require('../routes/monitor')
const monitor = require('../routes/monitor')
const Monitor = function () {}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
db.getConnection(async function (err, conn) {
if (err) {
db.destroy()
return cb(err)
}
try {
Monitor.getRepairAccessories = (id, callback) => {
conn.query(
'CALL `fGetMonitorAccessoriesforRepair`(?)',
id,
(err, res) => {
if (err) {
callback(err, null)
return
}
if (res[0].length) {
callback(null, res)
return
}
callback({ message: 'not_found' }, null)
}
)
}
Monitor.addFromRepairAccess = (newRepairs, callback) => {
conn.query(
'CALL `fRepairAccessoryAdd`(?, ?, ?)',
[newRepairs.accessories, newRepairs.num, newRepairs.comment],
(err, res) => {
if (err) {
callback(err, null)
return
}
if (res[0].length) {
callback(null, res)
return
}
callback(null, ...newRepairs)
}
)
}
Monitor.updateFromRepairAccess = (id, newRepairs, callback) => {
conn.query(
'CALL `fRepairAccessoryUpdate`(?, ?, ?)',
[id, newRepairs.num, newRepairs.comment],
(err, res) => {
if (err) {
callback(err, null)
return
}
callback(null, { id, ...newRepairs })
}
)
}
Monitor.deleteFromRepairAccess = (id, callback) => {
conn.query('CALL `fRepairAccessoryDelete`(?)', id, (err, res) => {
if (err) {
callback(err, null)
return
}
if (res.length) {
callback(null, res)
return
}
callback({ message: 'not_found' }, null)
})
}
Monitor.getDataAccessories = callback => {
conn.query('CALL `fRepairAccessoryGet`', (err, res) => {
if (err) {
callback(err, null)
return
}
if (res[0].length != null) {
callback(null, res[0])
return
}
callback({ message: 'not_found' }, null)
})
}
Monitor.createRepairs = (newRepairs, callback) => {
conn.query(
'CALL `fAddRepair`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[
newRepairs.id_monitors,
newRepairs.order_num,
newRepairs.warranty,
newRepairs.date_receipt,
newRepairs.malfunction,
newRepairs.date_repair,
newRepairs.date_verif,
newRepairs.date_ship,
newRepairs.id_user,
newRepairs.id_contact,
newRepairs.id_client,
newRepairs.id_status,
newRepairs.comment_str,
],
(err, res) => {
if (err) {
callback(err, null)
return
}
callback(null, { id: res[0][0].id, ...newRepairs })
}
)
}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
Monitor.copy = async (id, callback) => {
if (typeof callback === 'function') {
conn.query('CALL `fMonitorTmpCopy`(?)', id, (err, res) => {
if (err) {
callback(err, null)
return
}
if (res[0].length != null) {
callback(null, res)
return
}
})
} else {
const res = await conn
.promise()
.query('CALL `fMonitorTmpCopy`(?)', [id])
return res
}
}
Monitor.updateCopyMon = (id, newMonitor, callback) => {
conn.query(
'CALL `fMonitorTmpUpdate`(?, ?, ?, ?, ?, ?)',
[
id,
newMonitor.release,
newMonitor.verif,
newMonitor.comment,
newMonitor.dealer,
newMonitor.client,
],
(err_str, res) => {
let mess = res[0][0]['result']
err_str = 'monitor already exist'
if (mess == err_str) {
callback(err_str)
return
}
if (res[0].length != null) {
callback(null, res)
return
}
callback(null, ...newMonitor)
}
)
}
Monitor.saveCopyMon = async (id, callback) => {
if (typeof callback === 'function') {
conn.query('CALL `fMonitorTmpSave`(?)', id, (err, res) => {
if (err) {
callback(err, null)
return
}
if (res[0].length != null) {
callback(null, res)
return
}
callback(null, id)
})
} else {
const res = await conn
.promise()
.query('CALL `fMonitorTmpSave`(?)', [id])
return res
}
}
Monitor.getMonitorDataAccessories = callback => {
conn.query('CALL `fMonitorTmpAccessoryGet`()', (err, res) => {
if (err) {
callback(err, null)
return
}
if (res[0].length != null) {
callback(null, res[0])
return
}
callback({ message: 'not_found' }, null)
})
}
... еще сколько-то запросов
} catch (err) {
const errorPart1 = error.message.split(';')[0]
const errorPart2 = error.message.split(' use ')[1]
console.log(`%cError: ${errorPart1} ${errorPart2}`, 'color: #e53935')
} finally {
console.log('its db')
function printDb() {
console.log('connections')
console.log(db._allConnections)
console.log(db._allConnections.length)
}
setTimeout(function () {
printDb()
}, 10000)
conn.release()
}
})
Monitor.searchingMon = (id, callback) => {
db.query(
`SELECT * FROM monitors WHERE serial_number LIKE ? ORDER BY serial_number LIMIT 100`,
`${id}%`,
(err, res) => {
if (err) {
callback(err, null)
return
}
callback(null, res)
}
)
}
async function addDefaultAccessories(monitor) {
const res = await db
.promise()
.query('CALL fGetDefaultAccessories(?, ?)', [
monitor.id_monitors_ispolnenie,
monitor.id_complect,
])
for (let item of res[0][0]) {
db.query('INSERT INTO monitor_accessories SET ?', {
id_mon: monitor.id,
id_accessories: item.id,
num: 1,
comment: '',
})
}
}
Monitor.create = (newMonitor, callback) => {
db.query('INSERT INTO monitors SET ?', newMonitor, (err, res) => {
if (err) {
callback(err, null)
return
}
addDefaultAccessories({ id: res.insertId, ...newMonitor })
callback(null, { id: res.insertId, ...newMonitor })
})
}
...еще много запросов
module.exports = Monitor
P.S. Тут используется работа с временными таблицами, от того и проблема. Заранее спасибо за советы, касательно отказа от данного механизма, но это не совсем то, что нужно.
Таких файлов с запросами несколько.
Основной вопрос: Скажите пожалуйста, как это работает. Почему для каждого пользователя системы(многопользовательский портал, авторизация происходит по id и хранится в бд) не создается отдельное независимое подключение(процесс/сеанс в бд), оно пользуется одним процессом, от чего происходят сильные сбой, пользователи видят временные таблицы, которые создал другой юзер, потому что они делят сеанс. Что делать?