使用JS传递对象在节点中抛出新错误

Sha*_*ika 5 javascript node.js express reactjs react-native

我想在我的节点应用程序中抛出一个错误,如下所示。

throw new Error({ status: 400, error: 'Email already exists' });
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出。

Error: [object Object]
Run Code Online (Sandbox Code Playgroud)

我无法访问此错误对象的属性。我在这里做错了什么?

jfr*_*d00 15

Error对象的构造函数需要一个字符串,而不是一个对象(这就是您的方案不起作用的原因)。

在创建 Error 对象后,您可以自由地将您自己的自定义属性添加到它。

let err = new Error('Email already exists');
err.status = 400;
err.whateverElse = someValue;
throw err;
Run Code Online (Sandbox Code Playgroud)

错误对象上的标准属性(出于某种原因我不知道)不可枚举,因此它们不会出现在某些上下文中(即使它们存在)。您使用上述简单赋值添加的任何新属性都将是可枚举的。

仅供参考,您可以在多个地方执行此操作,您还可以将Error对象子类化并为您的子类提供一个构造函数,该构造函数接受您想要给它的任何参数。然后,该构造函数可以super(msg)从构造函数参数调用并将其自己的属性添加到错误对象中。

[object Object]是您的消息是因为您正在尝试将错误对象转换为字符串,并且该对象的默认字符串表示形式是[object Object]. 如果您尝试在字符串中使用错误对象,则会发生这种情况,例如:

console.log('Error: ' + err);
Run Code Online (Sandbox Code Playgroud)

相反,您应该console.log()像这样传递整个对象:

console.log('Error:', err);
Run Code Online (Sandbox Code Playgroud)

并且,console.log()获取整个对象并可以显示其属性。


aer*_*min 5

你可以尝试使用以下cause属性

TS目前关于它的值类型不准确,官方正在讨论解决这个问题

try {
     throw new Error('Email already exists', { 
       cause: { status: 400 } 
     });
   } catch(e) {
     console.log(e); // Error('Email already exists')
     console.log(e.cause) // { status: 400 }
   }
Run Code Online (Sandbox Code Playgroud)

或使用自定义属性抛出 Error 实例

try {
     const error = new Error('Email already exists');
     error.status = 400;
     throw error;
   } catch(e) {
     console.log(e); // Error('Email already exists')
     console.log(e.status) // 400
}
  
Run Code Online (Sandbox Code Playgroud)