javascript - 使用finally() 正确构建Javascript Promise

标签 javascript express promise

我正在构建一个 Express使用 mssql 构建的 API包。

如果我不打电话sql.close()然后我收到以下错误:

Error: Global connection already exists. Call sql.close() first.

我想让端点易于遵循和维护,并且喜欢使用 finally 的以下模式 promise 模式。

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())
})

但是,这会生成以下错误:

{ "code": "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 发送响应或错误后作为 promise 链的一部分?

最佳答案

.finally 接受函数,传递函数结果

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
})

关于javascript - 使用finally() 正确构建Javascript Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56976369/

相关文章:

javascript - Promise中间件

javascript - JS globalThis 在应该返回 undefined 或 null 时返回一个值

node.js - Sequelize插入连接表(多对多)

Css 无法与 ejs 模板引擎一起快速工作

javascript - Node.js Express 没有响应

javascript - 将 reject() 跳过 Promise 中所有随后的 then()

c# - 检测移动浏览器对 HTML5 支持的代码

javascript - 如果需要,将附加句子分成多行

javascript - 在 CodeIgniter 中高效压缩 CSS 和 JS

node.js - Node JS后端中的错误处理