【问题标题】:How does node.js return response to REST web service synchronously?node.js 如何同步返回响应到 REST Web 服务?
【发布时间】:2017-10-25 00:20:27
【问题描述】:

如果这很明显,请原谅!我很难理解 node.js 如何响应来自浏览器的请求。我已经浏览了互联网上的教程,其中 express.js 用于使用 node.js 构建其余的服务器端代码。现在除此之外,还设置了适用于承诺的路线。所以很明显,只有当 Promise 解决时才会发回响应。所以流程是-

// 第一行

浏览器 -> REST 服务

//第二行

REST 服务 -> 查找路由 -> 命中服务 -> 获取数据 -> 将数据发送回浏览器

第二行的整个过程处于异步模式。那么服务器端是否会有一个线程挂起,浏览器会等待启用 node.js 的 REST 服务返回响应?如果不是这样,浏览器或 REST 客户端(例如 POSTMAN)如何实时了解响应。

编辑:

我已经删除了外部链接,因为它造成了混乱。

【问题讨论】:

  • “那么服务器端会有线程挂起吗”——为什么会有?正如你所说,它使用承诺。
  • "浏览器将等待启用 node.js 的 REST 服务返回响应" — HTTP 客户端总是必须等待响应。网络需要时间。这里没有什么特别的。
  • 如果他们必须等待响应,一些线程也会在服务器端打开,对吗?否则你将如何返回响应?
  • @user3276247 不是线程,而是(TCP)连接。一个单线程进程可以同时打开多个进程。
  • @robertklep 谢谢

标签: javascript node.js rest express promise


【解决方案1】:

nodejs 不使用线程来处理网络请求。它对操作系统内置的网络使用异步支持。因此,nodejs 中的待处理网络请求不会为每个请求维护一个打开的线程。它将有一个打开的套接字。当该套接字上有待处理的数据时,将通知 nodejs 进程。

同样,promise 不会导致线程打开。 Promise 只是一种通知方案,当异步操作完成时,底层异步操作将解析或拒绝,然后 Promise 可以通知已注册 .then() 处理程序的代码。

在您提供的链接中,不清楚您指的是哪个代码。如果您想询问那里的特定代码,请将该代码直接粘贴到您的问题中,以使其清楚并遵循堆栈溢出关于您所询问的代码的准则,即您所询问的代码仅存在于外部链接中。

第二行的整个过程处于异步模式。那么会不会有一个线程挂在服务器端,浏览器会等待启用 node.js 的 REST 服务返回响应?

不清楚您所说的“第二行”是什么意思。您提供的链接中有很多代码。 nodejs 内部的网络请求不使用每个请求的线程。它们保留一个开放的 TCP 套接字,但使用操作系统中对套接字的底层异步通知支持,而不是本机线程。

如果不是这样,浏览器或 REST 客户端(例如 POSTMAN)如何实时了解响应。

POSTMAN 或 REST 客户端与服务器有一个 TCP 连接(在该 TCP 连接上使用 HTTP 协议)。他们创建 TCP 连接,然后在该套接字上发送 HTTP 请求,并且该套接字在等待响应时保持打开状态。当服务器完成其业务时,它通过打开的 TCP 套接字发回响应。客户端代码有很多不同的编写方式(POSTMAN 和浏览器可能以不同的方式编写客户端代码),但是当数据到达 TCP 套接字时,客户端会以某种方式被通知有数据要读取,客户端将读取该数据,处理响应,然后由于这是一个 HTTP 请求/响应协议,TCP 连接可能会被关闭。

【讨论】:

  • 外部链接只是为了说明流程 => REST 服务 -> 找到路线 -> 命中服务 -> 获取数据 -> 将数据发送回浏览器 我没有指任何那里有一段特定的代码。
  • 我还用评论注释了第二行。无论如何,您的回答解决了我的疑问。我会接受的。感谢您如此详细的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多