Я подключаюсь к SQL Server, используя Node пакет mssql в моем приложении Electron. Я не могу создать REST API.
Он работает нормально, хотя у меня есть опасения:
Это нормально?
Как это работает: app.js выполняет 2 запроса и записывает результаты
sql.js соединяется с БД
// app.js
const { getUser, getUsers } = require('./sql');
getUser(10).then((result) => {
console.dir(result);
});
getUsers.then((result) => {
console.dir(result);
})
// sql.js
const sql = require("mssql");
// DB credentials
const config = {
user: 'myuser',
password: '123',
server: 'myserver',
database: 'mydb',
options: {
encrypt: true
}
}
// Creates new connection pool for each query
function connectDB() {
const pool = new sql.ConnectionPool(config);
return pool.connect()
.then(pool => {
console.info('Connected to database');
// returns Promise
return pool;
})
.catch(err => console.info('Database connection failed!', err));
}
// 1st query
function getUser(id) {
const connection = connectDB();
return connection
.then(pool => {
return pool.request()
.input('PK_ID', sql.Int, parseInt(id))
.execute('[uspGetUser]');
})
.then(result => {
return result.recordset[0];
})
.catch(err => {
console.info('Query failed!', err);
});
}
// 2nd query
function getUsers() {
const DB = connectDB();
return DB
.then(pool => {
return pool.request()
.execute('[uspGetUsers]');
})
.then(result => {
return result.recordset[0];
})
.catch(err => {
console.info('Query failed!', err);
});
}
module.exports = {
getUser,
getUsers
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Решено!
Чтобы закрыть соединение с БД и вернуть результаты, мы можем использовать оператор наконец и функции asnyc / ожидание.
Оператор наконец позволяет выполнять код после попытки и уловить, независимо от результата.
// sql.js
const sql = require("mssql");
// DB credentials
const config = {
user: 'myuser',
password: '123',
server: 'myserver',
database: 'mydb',
options: {
encrypt: true
}
}
async function connectDB() {
const pool = new sql.ConnectionPool(config);
try {
await pool.connect();
console.info('Connected to database');
return pool;
}
catch(err) {
console.info('Database connection failed!', err);
return err;
}
}
async function getAll() {
const DB = await connectDB();
try {
const result = await DB.request()
.query('select * from [your_table]');
return result.recordset;
}
catch (err) {
console.info('Error querying database', err);
return err;
}
finally {
DB.close();
}
}
async function execute() {
let result = await getAll();
console.dir(JSON.stringify(result));
return result;
}
execute();
Как мы можем поддерживать одно соединение с БД. Вместо того, чтобы создавать соединение для каждого запроса
Нет, вам не нужно возвращать close a.k.a. release обратно в пул соединений после каждого запроса. Библиотека уже делает это за вас.
Метод pool.close() закроет все соединения в пуле. Технически вы должны делать это только при завершении работы приложения, а не после каждого запроса, поскольку создание нового пула каждый раз создает значительные накладные расходы для вашего приложения.
У меня самого был такой же вопрос, поэтому я поискал исходный код проекта.
Я мог бы обернуть запросы результатами
new Promiseиresolve, а затем закрыть соединение. Это работает (но это лучший способ?).