【问题标题】:Neither then nor catch is calledthen 和 catch 都没有被调用
【发布时间】:2017-05-04 13:28:54
【问题描述】:

我在 Node.js 中使用 mssql 模块。

我有以下内容,其中date 是 smalldatetime 的一列:

function getData(date, callback) {
  var qs = "select * from T1 where date='2017-04-31'";
  new sql.Request().query(qs).then(function (result) {
        return callback(null, result);
      }).catch(function (err) {
        return callback(err);
      });
}

date 过滤器中给定的值对于 smalldatetime 类型无效,但不会调用 thencatch 块。代码流跳转到 getData 函数的末尾,在 Node.js 系统的某个地方它生成了以下错误:

(node:11172) UnhandledPromiseRejectionWarning: UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 3): TypeError: Cannot read property '0' of undefined`

Node.js 应用程序也没有崩溃,因此(这是一个 Web 应用程序)客户端保持打开的连接。

我是否正确使用了then/catch 模式,或者这可能是模块中的错误?

【问题讨论】:

  • 您的qs 字符串未闭合。另外,您的callback 函数是什么样的?您是否可能尝试迭代结果,即使调用时出错?
  • 我已经修正了帖子中的错字。我现在也更清楚这个问题并更新了问题。
  • 如果没有更多信息,发生这种情况的唯一 (?) 方式是 catch 处理程序中的 callback(err) 调用引发错误。您可以通过添加另一个catch 来测试它。或者,您可以打开 devtools 的“停止未捕获的错误”复选框并在实际中捕获它。你能告诉我们callback 代码吗?在thencatch 处理程序的开头放置一些console.log 语句。设置一些断点。单步执行代码。顺便说一句,您似乎以一种奇怪的方式混合了承诺和回调。
  • 该错误似乎并非源自您问题中的代码。我假设 TypeError 来自您的 callback 函数。没有看到该代码,我们只是在猜测
  • then 块未被调用,因此回调未被调用。

标签: javascript node.js promise es6-promise


【解决方案1】:

查看文档(假设您使用的是https://github.com/patriksimek/node-mssql)...

sql.connect(config).then(function() {
    return sql.query('select * from mytable where id = ${value}')
}).then(result => {
    console.dir(result)
}).catch(err => {
    // ... error checks
})

因此,promise 似乎比您使用它的位置高一级(不是在 query 上)。

要使用回调,看起来你只是这样做:

new sql.Request().query(qs, callback)

根据我的阅读,.query 上的承诺只发生在插入、更新或删除时

【讨论】:

  • 谢谢。这是否意味着无法使用此模块捕获 select 错误?
  • 文档说如果 callbackquery 中省略,它会返回一个承诺。我没有看到任何关于限制使用某些查询类型的信息
  • 在文档中,在“受影响的行”下,有一个request.query(...).then(result => ...) 形式的示例,因此 OP 尝试的可能是可以的。据我所知,“如果您在查询中执行 INSERT、UPDATE 或 DELETE”条件适用于特定示例(受影响的行),而不适用于是否返回承诺。
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 2019-08-05
  • 2016-06-02
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多