如何解决Node.js mssql承诺

时间:2019-07-01 21:55:39

标签: node.js sql-server promise es6-promise tedious

我正在尝试使用来自SQL Server存储过程的响应,并将其传递到另一个存储过程中以记录响应数据。

但是,我不确定如何将它们链接在一起,因为它们似乎各自需要自己的连接池。

尝试1

// mssql@3.3.0

exports.chain = (req, res) => {
  sql.connect(config.properties).then(pool => {
    return pool.request()
      .execute("chain")
      .then(response => {
        return pool.request()
          .input("param", sql.NVarChar(300), result[0][0]["response"])
          .execute("chain2")
          .then(result => res.send(result))
          .catch(err => res.send(err))
      })
      .catch(err => res.send(err))
  })
}

// returns {}

尝试2

exports.chain = (req, res) => {
  sql.connect(config)
    .then(pool => {
      return pool.request()
        .execute("chain")
    }).then(result => {
      return pool.request()
        .input("param", sql.NVarChar(300), result[0][0]["response"])
        .execute("chain2")
    }).then(result => {
      res.send(result)
    }).catch(err => {
        // ... error checks
    })

  sql.on('error', err => {
    // ... error handler
  })
}

// Throws error HTTP Status: 500, HTTP subStatus: 1013

尝试3

sql.connect(config.properties).then(pool => {
  return pool.request()
    .execute("chain")
  }).then(response => {
    pool.request()
      .execute("chain2")
      .input('param', sql.NVarChar(300), response[0][0]['response'])
      .then(response => res.send(response))
      .catch(err => res.send(err))
})

// Throws error HTTP Status: 500, HTTP subStatus: 1013

超时可能与

有关
  

DeprecationWarning:由于安全性和可用性问题,不建议使用Buffer()。请改用Buffer.alloc(),Buffer.allocUnsafe()或Buffer.from()方法。

我将如何从第一个存储过程中获取响应并将其传递给第二个存储过程以进行记录?

1 个答案:

答案 0 :(得分:0)

连接池是一个包含多个TDS连接的实例,因此您应该能够将多个过程连接到同一池,因为新请求仅占用一个TDS连接。也许这是您的配置问题中的缺陷。

在您的第三个示例中。您的输入是在执行后出现的,因此可能导致错误。

当请求返回一个Promise时,您可以像以前那样将它们链接在一起,但是每个变量中的变量不在同一范围内,因此您无法访问从用户记录中接收到的用户,当您在当时要求其他要求时。

或者,如果需要跨响应访问变量,也可以通过回调嵌套它们:

sql.connect(config.properties).then(pool => {
    pool.request()
        .execute("chain", (error, response) => {
            const row = response.recordset;

            pool.request()
                .input('param', sql.NVarChar(300), row.foo)
                .execute("chain2", (err, res) => {
                    const row_ = res.recordset;

                    // send response to client
                });
        });
}).catch(err => {
    // error handling here
});

最好的解决方案可能是将存储过程作为JSON返回,并且无论如何您只需要一个请求。缺点是,您可能需要更多专门的程序。