Express.js 中的错误 - TypeError: app.listen() 必须在服务器上调用

Express.js 是一个流行的 Node.js 框架,用于构建 Web 应用程序和 API。它提供了许多有用的功能,如路由、中间件、模板引擎等。然而,在使用 Express.js 的过程中,你可能会遇到一个常见的错误:TypeError: app.listen() 必须在服务器上调用。本文将深入探讨这个错误的原因,并提供解决方案和一些示例代码。

错误原因

在使用 Express.js 时,你需要创建一个 Express 应用程序对象,然后调用它的 listen() 方法来启动服务器。例如:

----- ------- - -------------------
----- --- - ----------
----- ---- - -----

---------------- -- -- -
  ------------------- -- ------- -- ---- ----------
---

然而,有时你可能会在调用 app.listen() 方法时遇到 TypeError: app.listen() 必须在服务器上调用 的错误。这是因为你可能在错误的上下文中调用了 app.listen() 方法。

更具体地说,当你在一个异步函数或回调函数中调用 app.listen() 方法时,可能会发生这个错误。例如:

----- ------- - -------------------
----- --- - ----------
----- ---- - -----

------------- -- -
  ---------------- -- -- -
    ------------------- -- ------- -- ---- ----------
  ---
-- ------

在这个例子中,我们在 setTimeout() 回调函数中调用了 app.listen() 方法。由于 setTimeout() 是一个异步函数,它会在 1 秒后执行回调函数。而在这个回调函数中调用 app.listen() 方法会导致错误,因为此时 Node.js 的事件循环已经结束。

解决方案

要解决这个错误,你需要确保在正确的上下文中调用 app.listen() 方法。通常情况下,你应该在主模块中调用 app.listen() 方法。主模块是指你的应用程序的入口文件,通常是 app.js 或 index.js。

例如,你可以将上面的示例代码重构为以下代码:

----- ------- - -------------------
----- --- - ----------
----- ---- - -----

---------------- -- -- -
  ------------------- -- ------- -- ---- ----------
---

------------- -- -
  ------------------- ---------
-- ------

在这个例子中,我们将 app.listen() 方法放在主模块中,而 setTimeout() 回调函数则放在 app.listen() 方法之后。这样就可以避免错误了。

如果你必须在异步函数或回调函数中调用 app.listen() 方法,你可以考虑使用一个 Promise 来等待异步操作完成后再调用 app.listen() 方法。例如:

----- ------- - -------------------
----- --- - ----------
----- ---- - -----

----- ----------- - -- -- --- ----------------- ------- -- -
  ------------- -- -
    ---------------- -- -- -
      ------------------- -- ------- -- ---- ----------
      ----------
    ---
  -- ------
---

--------------------- -- -
  ------------------- ------- ----------------
-------------- -- -
  --------------------- -- ----- --------- -----
---

在这个例子中,我们将 app.listen() 方法放在一个 Promise 中,并在异步操作完成后调用 resolve() 方法。然后我们在主模块中调用 startServer() 方法,并使用 Promise 的 then() 和 catch() 方法处理成功和失败的情况。

总结

在使用 Express.js 时,要注意在正确的上下文中调用 app.listen() 方法,避免出现 TypeError: app.listen() 必须在服务器上调用 的错误。如果必须在异步函数或回调函数中调用 app.listen() 方法,可以考虑使用 Promise 来等待异步操作完成后再调用 app.listen() 方法。

示例代码:https://github.com/Jason-Adam/express-error-typeerror-app-listen-must-be-called-on-the-server

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65fcfb95d10417a2228574f8