JS - как завершить соединение БД с помощью связанного обещания - PullRequest
0 голосов
/ 24 января 2020

Я объявляю свои функции БД в одном файле и хочу, чтобы они возвращали обещание, чтобы я мог использовать их в другом месте. Вопрос как закончить соединение? Я знаю, что мог бы вызывать conn.end() в любом месте, где я вызываю свою функцию БД, но не мог ли я сделать это в самой функции БД?

Вызывающий ...

function scanBoard(qrCode) {
    getBoard(qrCode)
    .then(b => {
        board = b;
    });
}

Функция БД (обратите внимание, код не будет работать, поскольку он содержит все, что я пробовал)

function getBoard(qrcode) {

    return db.createConnection(dbConfig)
    .then(conn => {
        let rows = conn.query("SELECT * FROM boards WHERE id = ?", [qrcode])
        .then(() => { conn.end() }); // Can't call it here cus it ends conn before rows is set

        conn.end(); // Can't call it here cus rows is still pending

        if (rows.length >= 1)
            return rows[0];

        return null;
    })
    .finally({
        conn.end(); // Can't call it here cus it gets called before the 'then' block in the caller
    });


}

Ответы [ 4 ]

2 голосов
/ 24 января 2020

Я бы не советовал закрывать соединение после каждого вызова метода БД. это очень менее эффективно, вместо этого вы можете использовать пул соединений. см. здесь для получения более подробной информации

https://www.npmjs.com/package/mysql#pooling -соединения

И когда вся работа завершена, вы можете закрыть соединения в пуле. См. Это

https://www.npmjs.com/package/mysql#closing все соединения в пуле

Надеюсь, это поможет.

1 голос
/ 24 января 2020

conn.query является асинхронным c, поэтому then завершится и finally будет запущено до того, как запрос даст какие-либо результаты, даже если это займет всего пару мс. Неважно, что вы выполняете обещание, выполненное вложение будет выполнено, или, скорее, выполнится цепочка then.

async function getBoard(qrcode) {
  const conn = await db.createConnection(dbConfig);

  try {
    return await conn.query("SELECT * FROM boards WHERE id = ?", [qrcode]);
  } finally {
    conn.end();
  }
}

Просто в качестве подсказки - если это приложение работает постоянно, вы можно просто подключиться к БД один раз и повторно использовать соединение, тогда необходимость открывать и закрывать соединение для каждого запроса устраняется.

0 голосов
/ 24 января 2020
  async function scanBoard(qrCode)
 {

      let board = await getBoard(qrCode);
  }
  catch (e)
  {
      throw e;
  }

 }

async function getBoard(qrcode)
      {

                let dbConn = await  db.createConnection(dbConfig);
                let rows = await dbConn.query("SELECT * FROM boards WHERE id = ?", [qrcode]);
                if (rows.length >= 1)

                // If you need to re-use connection, create a connection instance and re-use.Do not close here

                return rows[0];            
        }
0 голосов
/ 24 января 2020

Я думаю, что здесь лучшее решение состоит в том, чтобы следовать лучшим практикам ... Чтобы решить вашу проблему, я думаю, лучше распределить conn.end(); в finally части цепочки обещаний с условием if, так что оно срабатывает только если запрос прошел успешно или нет ожидающих запросов. Я сделаю это так:

.finally({
      if(conn){
          conn.end();
      }
 });

Очевидно, вам нужно удалить строку кода conn.end(); из любой другой части вашего исходного кода. Я бы даже подумал о поиске других ошибок с большим количеством catch().

надеюсь, что это помогло мне ответить на любой вопрос, который вы хотите.

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