如何使用 Express .listen() 处理错误(在 Typescript 中)?

Posted

技术标签:

【中文标题】如何使用 Express .listen() 处理错误(在 Typescript 中)?【英文标题】:How to handle errors with Express .listen() (in Typescript)? 【发布时间】:2019-10-10 23:29:05 【问题描述】:

目前正在将我的项目转换为使用 Typescript。我之前在 Node 中启动 Express 的工作代码如下所示:

server.listen(port, (error) => 
  if (error) throw error;
  console.info(`Ready on port $port`);
);

现在我得到一个 Typescript 错误:

Argument of type '(error: any) => void' is not assignable to parameter of type '() => void'.

我尝试为参数分配一个类型,例如error: Errorerror: any,但这并不能解决问题。我在这里做错了什么?

另外,由于我是 Typescript 的新手,虽然我已经找到了大量学习 Typescript 的资源,但我有什么地方可以了解如何在更特定于 npm 包的场景中处理 Typescript?

【问题讨论】:

throw 不是函数。 @JackBashford 我的错,错字。我已将问题中的代码修复为我之前工作过的代码。虽然仍然有 Typescript 错误。 您确定server.listens callback 有签名(err)=> 吗? 【参考方案1】:

我今天也遇到了。这是对类型定义的(重大)更改:

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/47063

该 PR 的作者建议处理侦听错误的正确方法是注册一个侦听器(如上面 Jonas 所链接):​​

https://nodejs.org/api/net.html#net_server_listen

听起来类型定义是个谎言,而且该参数并不真正存在,因此从您的应用程序中删除它的使用应该是无操作的。这就是我正在做的事情。 (此外,我对 EADDRINUSE 使我的应用程序崩溃之类的错误感到满意,因此我不会添加任何新的错误处理)

【讨论】:

【参考方案2】:

没有error¹。

 server.listen(port, () => 
   console.info(`Ready on port $port`);
 );

要侦听错误,请使用server.listen(port).on("error", /*...*/) ²。

¹:文档非常嵌套:

Express docs 说,那个

此方法与 Node 的 http.Server.listen() 相同。

现在these docs 说,htt.Server.listen 等于 Net.server.listen

然后that 说:

这个函数是异步的。当服务器开始监听时,将发出“监听”事件。最后一个参数回调将被添加为 'listening' 事件的监听器。

现在"listening" event 似乎没有引发任何错误。

²:这是我在Express issuetracker 中找到的推荐方式。

请注意,在大多数情况下您不想处理错误,如果服务器崩溃,最好的选择很可能是重新启动整个过程。

【讨论】:

我也是这么想的,因为错误说它需要()=>,但我们给出的是(err)=> 谢谢!!!!你救了我的心!!!

以上是关于如何使用 Express .listen() 处理错误(在 Typescript 中)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ExpressJS 处理飞行前请求

十使用Express写接口

十使用Express写接口

express 如何上传文件的原理和实现

简明Express教程

简明Express教程