Глобальное соединение уже существует, несмотря на sql.close () - PullRequest
0 голосов
/ 04 октября 2019

Я создал функцию запроса для подключения к базе данных mssql, как показано ниже:

  query(query) {
    return sql.connect(config.connection.sqlserver).then(() => sql.query(query)).then((result) => {
      sql.close();
      return result.recordset;
    }).catch((err) => console.log(err));
  },

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

enter image description here

Но когда я отправляю запрос со стороны клиента на сторону сервераЯ получаю сообщение об ошибке, как показано ниже:

(node:19724) UnhandledPromiseRejectionWarning: Error: Global connection already
exists. Call sql.close() first.
    at Object.connect (C:\repos\mtg-app\node_modules\mssql\lib\base.js:1723:31)
    at query (C:\repos\mtg-app\server\query.js:6:16)
    at asyncCall (C:\repos\mtg-app\server\routes\index.js:19:11)
    at router.get (C:\repos\mtg-app\server\routes\index.js:29:3)
    at Layer.handle [as handle_request] (C:\repos\mtg-app\node_modules\express\l
ib\router\layer.js:95:5)
    at next (C:\repos\mtg-app\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\repos\mtg-app\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\repos\mtg-app\node_modules\express\lib\router\layer.js:95:5)
    at C:\repos\mtg-app\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\repos\mtg-app\node_modules\express\lib\router\index.js:335:12)
(node:19724) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:19724) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я не понимаю, во-первых, почему он работает только на сервере, а во-вторых, почему он не работает, несмотря на метод sql.close ()? Пожалуйста, объясните мне этот вопрос очень хорошо.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Я сделал это проще, чем ниже. Но спасибо Раймонду, потому что я понял, что должен использовать ConnectionPool. Мой модуль запросов:

/* eslint-disable import/no-unresolved */
const mssql = require('mssql');
const database = require('./config/connection');

const pool = new mssql.ConnectionPool(database.config).connect();

async function query(sql) {
  try {
    const connection = await pool;
    const result = await connection.query(sql);
    return result.recordset;
  } catch (err) {
    console.log('SQL error', err);
  }
  return [];
}

module.exports.query = query;

Теперь, когда я хочу использовать его, например, в модуле маршрутизатора:

router.get('/get-users', (req, res, next) => {
  const usersStandings = [];
  sql.query('select u.name, s.points from dbo.[user] u join dbo.standings s on s.id = u.standings_id join dbo.category c on c.id = s.category_id where c.type = \'Tournament\' order by points desc').then((rows) => {
    rows.forEach((element) => {
      usersStandings.push(element);
    });
    res.send(usersStandings);
  });
});

Теперь у меня нет проблем с глобальным подключением и т. Д.

0 голосов
/ 04 октября 2019

Что касается моего комментария, что-то в этом роде.

async function query(q) {
    return new Promise((resolve, reject) => {
        new sql.ConnectionPool({/* Config */}).connect().then((pool) => {
            return pool.request().query(q)
        }).then((result) => {
            // Resolve result
            resolve(result);
            // Close sql.close();
            sql.close();
        }).catch((error) => {
            // Reject error
            reject(error);
            // Close sql.close();
            sql.close();
        });
    });
}

query(`SELECT * FROM`)
    .then((response) => {
        // Success
        console.log(response);
    })
    .catch((error) => {
        // Error
        console.log(error);
    })
    .finally(() => {
        // Clean-up
    });

Или другим способом, с mysqlijs все из документации здесь .

const mysql = require('mysql');
const pool  = mysql.createPool({/* Config */});

pool.getConnection(function(error, connection) {
    if (error) {
        throw error;
    }

    // Use the connection
    connection.query(`SELECT * FROM`, function (error, results, fields) {
        // When done with the connection, release it.
        connection.release();
        // Handle error after the release.
        if (error) throw error;
        // Don't use the connection here, it has been returned to the pool.
    });
});

pool.on('acquire', function (connection) {
    console.log('Connection %d acquired', connection.threadId);
});

pool.on('enqueue', function () {
    console.log('Waiting for available connection slot');
});

pool.on('release', function (connection) {
    console.log('Connection %d released', connection.threadId);
});


pool.end(function (err) {
    // Ending all connection the the MySQL pool.
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...