我正在尝试使用 TypeScript 处理 NodeJS 引发的异常。
例如,如果我收到
ECONNREFUSED
异常,则它的类型为 SystemError
。
但是现在,因为
err
是any
类型,所以我只能这么做
redisClient.on('error', (err) => {
console.log('Error: ', err);
});
但是我想缩小错误类型的范围,类似于这样:
redisClient.on('error', (err) => {
if (err instanceof ErrnoException) {
if(err.code === 'ECONNREFUSED ') {
throw new Error('Connection refused');
}
}
throw err;
});
但不幸的是,
SystemError
在Node中没有导出。NodeJS.ErrnoException
的讨论,但似乎已被删除。
以下是如何在 TypeScript 中处理此类错误:
import { RedisClient } from 'redis';
const redisClient = new RedisClient({});
redisClient.on('error', (err: unknown) => {
if (isErrnoException(err)) {
if (err.code === 'ECONNREFUSED') {
throw new Error('Connection refused');
}
}
throw err;
});
function isErrnoException(error: unknown): error is NodeJS.ErrnoException {
return (
error instanceof Error &&
typeof (error as NodeJS.ErrnoException).code === 'string' &&
typeof (error as NodeJS.ErrnoException).errno === 'number' &&
typeof (error as NodeJS.ErrnoException).syscall === 'string'
);
}
说明:
函数 isErrnoException 是一个自定义类型保护,用于检查 err 对象是否具有通常在 NodeJS.ErrnoException 上找到的属性(如 code、errno 和 syscall)。 该函数用于将类型从unknown缩小到NodeJS.ErrnoException。
在错误事件处理程序中,我们首先使用类型保护检查错误是否为 ErrnoException。 如果是,我们进一步检查代码属性以处理特定的系统错误,例如 ECONNREFUSED。