Node.js 节点和续集->。捕获(…)不是';他没有按预期工作

Node.js 节点和续集->。捕获(…)不是';他没有按预期工作,node.js,try-catch,sequelize.js,Node.js,Try Catch,Sequelize.js,我这里有一个非常简单的例子。在本例中,“token”是模型上的只读属性,当您尝试写入它时会抛出错误。这只是为了强制执行一个错误,以显示如何不调用.catch(…)。下面是一个非常简单的示例代码(名称、说明、正常运行时间都是在我们开始编写此代码之前设置为静态值的变量): 捕获永远不会被调用,http请求只是在那里旋转,控制台输出非常清楚地显示异常只是冒泡而没有被捕获 Sequelize调用中的catch(…)遗漏了什么 谢谢 下面是异常堆栈输出的相关信息。文本“This is a read onl

我这里有一个非常简单的例子。在本例中,“token”是模型上的只读属性,当您尝试写入它时会抛出错误。这只是为了强制执行一个错误,以显示如何不调用.catch(…)。下面是一个非常简单的示例代码(名称、说明、正常运行时间都是在我们开始编写此代码之前设置为静态值的变量):

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

Sequelize调用中的catch(…)遗漏了什么

谢谢

下面是异常堆栈输出的相关信息。文本“This is a read only property”是我在尝试写入该属性时生成并抛出的错误消息

Unhandled rejection Error: This is a read-only property

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

查看注释,引发错误的行似乎是:

models.TANServer.create({
  name : name,
  description : description,
  defaultUpTime : defaultUpTime,
  token : "apple"
})
如果是这种情况,则不会返回任何承诺,因此不会运行
.then
.catch
表达式,也不会返回任何响应

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

如果我无法修复
。创建
?
如果
.create
是第三方代码,或者如果您在大多数情况下需要同步错误,但这种情况很痛苦,您可以将对create的调用封装在
try/catch
语句或
Promise中。解决
块:

try {
  models.TANServer.create(...).then(...).catch(...);
catch (e) {
  // A synchronous exception happened here
}

// Alternatively (and much better IMO):
Promise.resolve().then(() => {
  // Any synchronous errors here will fail the promise chain
  // triggering the .catch
  return models.TANServer.create(...);
}).then(server => {
  // Use server here
}).catch(reason => {
  // All errors show up here
});

这里没有任何内容看起来像是对只读属性的写入。您确定拒绝错误来自此代码吗?是的,在我的模型中,我在写入该属性时引发异常。我没有显示该模型,因为它目前只是一个超级简单的模型,并且有一个名称、描述、正常运行时间和令牌属性。令牌在生成新记录时在模型中生成,并作为只读值永久存在于该记录中,类似于db id。具体来说,它只是一个UUID。公平/明确地说,我可以很容易地删除它并只使用记录id,但这并不能真正改变我所面临的问题。简而言之,调用TANServer.Create({…})生成的异常是否应该冒泡到所列的.catch(…)块?这有点奇怪的意义。谢谢.Create完全在我的控制之下,所以我可以做到。多谢!谢谢。在我看来,Sequelize文档在某些方面不够清晰。我不确定我读过的东西是否像你在几个小时的阅读、测试、记录、实验中指出的那样简洁直接。谢谢,伙计!
try {
  models.TANServer.create(...).then(...).catch(...);
catch (e) {
  // A synchronous exception happened here
}

// Alternatively (and much better IMO):
Promise.resolve().then(() => {
  // Any synchronous errors here will fail the promise chain
  // triggering the .catch
  return models.TANServer.create(...);
}).then(server => {
  // Use server here
}).catch(reason => {
  // All errors show up here
});