Правильная конструкция обещания Javascript с использованием finally () - PullRequest
0 голосов
/ 10 июля 2019

Я создаю Express API, созданный с помощью пакета mssql.

Если я не позвоню sql.close(), я получу следующую ошибку:

Ошибка: глобальное соединение уже существует. Сначала вызовите sql.close ().

Я бы хотел, чтобы конечные точки были простыми для отслеживания и поддержки, и как следующий шаблон, используя шаблон обещания finally.

const sql    = require("mssql")
const config = require("../config")

sql.connect(config.properties).then(pool => {
  return pool.request()
    .execute('chain')
    .then(response => {
      res.send(response['recordsets'][0][0]['response'])
    })
    .catch(err => res.send(err))
    .finally(sql.close())
})

Однако это приводит к следующей ошибке:

{ "код": "ENOTOPEN", "name": "ConnectionError" }

Следующий код работает, но кажется немного неуклюжим определять несколько раз sql.close в одной и той же функции.

sql.connect(config.properties).then(pool => {
  return pool.request()
    .execute('chain')
    .then(response => {
      res.send(response['recordsets'][0][0]['response'])
      sql.close()
    })
    .catch(err => {
      res.send(err)
      sql.close()
    })
})

Можно ли позвонить sql.close как часть цепочки обещаний после отправки ответа или ошибки с res.send?

1 Ответ

2 голосов
/ 10 июля 2019

. Наконец принимает функцию, вы передаете результат функции

sql.connect(config.properties).then(pool => {
  return pool.request()
    .execute('chain')
    .then(response => {
      res.send(response['recordsets'][0][0]['response'])
    })
    .catch(err => res.send(err))
    .finally(() => sql.close()) // FIX HERE
})
...