如何处理 TypeScript 中的 NodeJS 错误?

问题描述 投票:0回答:1

我正在尝试使用 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中没有导出。
确实在 GitHub 上找到了 4 年前关于 NodeJS.ErrnoException
讨论
,但似乎已被删除。
目前在 NodeJS 中可以吗?

javascript node.js typescript error-handling
1个回答
0
投票

以下是如何在 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):

函数 isErrnoException 是一个自定义类型保护,用于检查 err 对象是否具有通常在 NodeJS.ErrnoException 上找到的属性(如 code、errno 和 syscall)。 该函数用于将类型从unknown缩小到NodeJS.ErrnoException。

  • 错误处理:

在错误事件处理程序中,我们首先使用类型保护检查错误是否为 ErrnoException。 如果是,我们进一步检查代码属性以处理特定的系统错误,例如 ECONNREFUSED。

© www.soinside.com 2019 - 2024. All rights reserved.