Express.js与Node.js,多个客户端

1 javascript mysql node.js express

我在Google上找不到很好的答案,所以我在这里尝试。

我的应用程序包括:Express.js,node.js和一个MySQL数据库。但是,此应用程序需要为多个客户端提供服务。

在我的代码中,我需要使用回调,以便程序在继续之前等待数据库查询完成。这会影响想要同时访问数据库的其他用户吗?

Don*_*bot 6

为了明确回答这个问题,我认为需要对Node.js异步事件循环有更深入的了解。

JavaScript是单线程的,并且使用此异步事件循环,Node.js可以在此单线程上执行非阻塞I / O操作。

它实现此目标的方法是在需要时(例如,在有许多请求或I / O操作时)将操作分流到内核,然后在事件循环中稍后的时间将结果取回。 “投票”阶段。

为了进一步说明,我提供了Node.js文档中提供的图表:

   ?????????????????????????????
??>?           timers          ?
?  ?????????????????????????????
?  ?????????????????????????????
?  ?     pending callbacks     ?
?  ?????????????????????????????
?  ?????????????????????????????
?  ?       idle, prepare       ?
?  ?????????????????????????????      ?????????????????
?  ?????????????????????????????      ?   incoming:   ?
?  ?           poll            ?<??????  connections, ?
?  ?????????????????????????????      ?   data, etc.  ?
?  ?????????????????????????????      ?????????????????
?  ?           check           ?
?  ?????????????????????????????
?  ?????????????????????????????
????      close callbacks      ?
   ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

您可以在以下网址详细了解这些阶段:https//nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

简而言之:

  • 计时器:计划的回调以及在计时器上设置的所有内容都将在此处执行,例如setInterval()或setTimeout()。首先的原因是,这些只是为了保证指定的时间量是触发它们所需的最短时间。此时间也用事件循环周期完成的时间来填充。在此处放置它们是使它们最准确地达到开发人员在间隔或超时功能内指定的值的方式。
  • 待处理的回调:执行推迟到下一个循环迭代的I / O回调。如果在任何事件循环中都达到了最大回调数,则需要执行的其余回调将推迟到下一个循环(可以通过process.nextTick()手动实现),因此-在计时器之后,这些应该执行下一个
  • 空闲:仅在内部使用。如果事件循环中没有剩余要处理的内容,则该循环将停止将任何内容推迟到内核,直到必要时为止
  • 准备:仅供内部使用。如果需要一个或多个事件循环,则为下一个事件循环做好准备
  • 轮询:检索新的I / O事件;执行与I / O相关的回调(除了关闭回调,计时器调度的回调和setImmediate()之外,几乎所有这些回调);适当时,节点将在此处阻塞。此轮询阶段使所有延迟执行的操作得以继续。
  • 检查:在这里调用setImmediate()回调
  • close回调:这里调用了一些close回调,例如socket.on('close',...)和其他'close'事件

同样,大部分内容来自Node.js文档,但我已经详细说明了一些细节,以提供一些有关此上下文的理解。

在您的情况下,您的数据库操作不会“阻止”其他用户,他们只需要等待直到通过循环处理其回调即可。如果同时执行许多操作,则会将更多操作卸载到内核,然后尽快进行备份,这可能会带来一些额外的延迟(1)

本文还提供了另一个有助于形象化此过程的良好图形:https : //webapplog.com/you-dont-know-node/

节点异步事件循环图形

在旁注-

在某些地方,Node.js的事件循环是一个很好的解决方案,而在其他地方,更健壮的多线程解决方案可能是一个更好的解决方案。确保您进行所需的研究以明智地做出与您的项目细节相关的决定,这绝不是一个坏主意。

(1)仅有几篇文章供您搜索,有关性能差异,网络负载过重的预期延迟以及针对此问题的各种解决方案。

我希望这有帮助!