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

时间:2019-05-24 11:01:49

标签: javascript node.js typescript express

当前将我的项目转换为使用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的? / p>

2 个答案:

答案 0 :(得分:2)

没有error¹。

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

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

¹:文档非常嵌套:

Express docs说,

  

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

现在these docshtt.Server.listen等于Net.server.listen

然后that说:

  

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

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

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

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

答案 1 :(得分:0)

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

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

PR的作者建议,处理侦听错误的正确方法是注册一个侦听器(如以上乔纳斯所链接):​​

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

听起来类型定义是一个谎言,并且该参数实际上并不存在,因此从您的应用程序中删除其使用应该是一个禁忌。那就是我在做的(此外,我对EADDRINUSE之类的错误使我的应用程序崩溃没问题,所以我没有添加任何新的错误处理)