Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么在所有请求之后app.listen应该在末尾?为什么有必要呢?_Node.js_Express - Fatal编程技术网

Node.js 为什么在所有请求之后app.listen应该在末尾?为什么有必要呢?

Node.js 为什么在所有请求之后app.listen应该在末尾?为什么有必要呢?,node.js,express,Node.js,Express,为什么app.listen在末尾?它不应该放在app.get之前,以便在端口5000侦听请求吗 为什么app.listen在末尾 请参见下文,但主要是作为一种约定,使用逻辑和安全的初始化顺序,在启动服务器并将其暴露给传入连接之前,首先配置服务器 它不应该放在app.get之前,以便在端口5000侦听请求吗 否,app.get注册路由处理程序。在这种情况下,寄存器意味着它将路由添加到一个内部列表中,这样,当将来的某个传入请求到达时,Express可以查看该列表,以查看哪些路由处理程序与请求的路径匹

为什么app.listen在末尾?它不应该放在app.get之前,以便在端口5000侦听请求吗

为什么app.listen在末尾

请参见下文,但主要是作为一种约定,使用逻辑和安全的初始化顺序,在启动服务器并将其暴露给传入连接之前,首先配置服务器

它不应该放在app.get之前,以便在端口5000侦听请求吗

否,app.get注册路由处理程序。在这种情况下,寄存器意味着它将路由添加到一个内部列表中,这样,当将来的某个传入请求到达时,Express可以查看该列表,以查看哪些路由处理程序与请求的路径匹配。在应用程序对象上注册路由处理程序之前,需要先创建该应用程序对象,但服务器是否已启动并不重要

请记住,app.get所发生的一切就是将路由定义添加到内部列表中,以便在将来某个时间将其与传入路径进行比较,以查看其是否匹配。它实际上没有运行任何路由处理程序。您可以逻辑地将其视为注册事件侦听器。类似地,所做的只是向列表中添加一些数据,以便将来可以调用某些内容

所以,我们已经证明,在注册路线之前或之后是否调用app.listen其实并不重要。路线将被登记,以备将来使用

配置服务器然后启动服务器似乎是一种常见的约定,但没有理由这样做

如果启动服务器,然后配置路由,从逻辑上看,服务器运行的时间窗口可能存在,但所有路由尚未定义,这可能会创建一个奇怪的时间窗口,在该时间窗口中,人们可能连接到服务器,期望它正常运行,但尚未完全配置。但是,由于Javascript的单线程特性,这可能不会引起问题。如果传入请求在您启动服务器之后到达,但在您配置所有路由之前到达,仍然不会导致问题。这是因为,当同步服务器初始化代码运行时,传入的请求将插入到Javascript事件队列中,并且在当前运行的Javascript完成之前,不会将其从队列中拉出。因此,只要您在这个Javascript中定义了所有路由,它们就会在实际处理第一个请求之前被完全配置。这意味着在处理传入请求之前,仍将定义所有路由。因此,它们将及时到位

所以。。。对于大多数普通的同步服务器初始化代码来说,在配置路由之前还是之后执行app.listen实际上并不重要。它很可能是最后一个完成的,就像一个逻辑约定,似乎是完成配置服务器然后启动服务器的适当顺序

我应该提到一个边缘案例。如果出于某种原因,服务器初始化的一部分涉及进行异步调用,例如,某个app.get在某个异步回调中,而您在启动该回调之前正在执行app.listen,则服务器运行的时间窗口将打开,但尚未正确配置。这不是通常的服务器配置方式,但仍然可以这样做。因此,在这种情况下,为了避免在部分配置的服务器上处理请求,您需要等待调用app.listen,直到完成所有异步操作

const app = express();
app.get("/", (req, res) => {
  res.send("Hello there");
});
const PORT = process.env.PORT || 5000;

app.listen(PORT, () => console.log(`server started on ${PORT}`));