【问题标题】:How to handle errors with Express .listen() (in Typescript)?如何使用 Express .listen() 处理错误(在 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)=> 吗?

标签: javascript node.js typescript express


【解决方案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)=>{}
    • 谢谢!!!!你救了我的心!!!
    猜你喜欢
    • 2022-10-06
    • 2017-04-19
    • 2021-04-14
    • 2021-04-29
    • 1970-01-01
    • 2012-03-02
    • 2016-06-16
    • 2014-12-15
    • 2021-08-05
    相关资源
    最近更新 更多