我正在尝试处理node.js中的错误。
运行box.diagonalUp=True
会得到:
console.log(error)
但是,如果我尝试运行TypeError: Cannot read property 'id' of undefined
at solrClient.search.then.res (/.../schema.js:72:20)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:189:7)
,则会得到Object.keys(error)
个空数组。对于不同的错误,我确实得到了[]
。
尝试访问上述错误的属性时,['message', 'code', 'type', 'errno']
仍然有效。
尽管隐藏了这些属性,是否有可能获得其名称?
答案 0 :(得分:1)
TypeError不是数组/映射,是定义明确的异常实例:
如果(例如TypeError实例)
示例:
catch (e) {
if (e instanceof TypeError) {
// Output expected TypeErrors.
//Here try to get the information you need here
logging.log(e);
} else {
// Output unexpected Errors.
logging.log(e, false);
}
看一下: https://airbrake.io/blog/nodejs-error-handling/node-typeerror
答案 1 :(得分:1)
Object.keys
仅返回自己的可枚举属性。如果不返回任何内容,则意味着message
是从原型继承的或不可枚举的,TypeError
属性就是后者。
不可枚举的属性可以用Object.getOwnPropertyNames(error)
列出。
可以通过遍历原型来检索继承的属性:
let proto = error;
while (proto) {
console.log(Object.getOwnPropertyNames(proto));
proto = Object.getPrototypeOf(proto);
}
答案 2 :(得分:0)
可能不是真的,但我认为接下来会有问题...
您正在使用solr-node-client库。该库依赖于bluebird库。 最后一个库创建自己的TypeError类,例如以下代码:
function subError(nameProperty, defaultMessage) {
function SubError(message) {
if (!(this instanceof SubError)) return new SubError(message);
notEnumerableProp(this, "message",
typeof message === "string" ? message : defaultMessage);
notEnumerableProp(this, "name", nameProperty);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
} else {
Error.call(this);
}
}
inherits(SubError, Error);
return SubError;
}
并且此代码将消息和名称属性设置为不可枚举。