节点和续集 - > .catch(...)没有按预期工作

时间:2017-05-02 02:16:28

标签: node.js try-catch sequelize.js

我在这里有一个非常简单的例子。在这种情况下,'令牌'是模型上的只读属性,并在您尝试编写时抛出错误。这只是为了强制显示错误,以显示.catch(...)是如何被调用的。下面是非常简单的示例代码(名称,描述,正常运行时间是在我们到达此代码之前将所有变量设置为静态值):

models.TANServer.create({
    name : name,
    description : description,
    defaultUpTime : defaultUpTime,
    token : "apple"
})
.then( function( server ){

    if( !server ){
        res.statusCode = 400;
        res.end( "unknown error creating new server entry" );
        return;
    }

    res.statusCode = 200;
    res.end( JSON.stringify( server ) );
    return;

}).catch( function( reason ){
    res.statusCode = 500;
    res.end( "This should print out " + reason + " but is never called as the error stack goes to console, and nothing ever is caught." );
    return;
});

永远不会调用catch,http请求只是在那里旋转,控制台输出非常清楚地显示异常只是冒出来而没有被捕获。

在Sequelize电话中,我对.catch(...)缺少什么?

感谢。

以下是异常堆栈输出的相关信息。文本"这是一个只读属性"是我生成的错误消息,并在您尝试写入该属性时抛出。

Unhandled rejection Error: This is a read-only property

1 个答案:

答案 0 :(得分:4)

问题是.catch只捕获了承诺解析处理程序中抛出的问题(即,在您的示例中传递给.then的函数)。

查看评论,似乎抛出错误的行是:

models.TANServer.create({
  name : name,
  description : description,
  defaultUpTime : defaultUpTime,
  token : "apple"
})

如果是这种情况,则不会返回promise,因此.then.catch表达式永远不会运行,也不会返回任何响应。

修复方法是更改​​.create,以便它返回失败的承诺(使用Promise.reject)而不是抛出错误

如果我无法修复.create怎么办?

如果.create是第三方代码,或者您大多数时候需要同步错误,但是这种情况很痛苦,您可以将调用包装在try / catch语句或{{ {1}}阻止:

Promise.resolve