Node.js中是否有推荐的对象创建方法?

Node.js中是否有推荐的对象创建方法?,node.js,object,architecture,request,Node.js,Object,Architecture,Request,我知道在PHP中,会为每个请求创建对象,并在处理完成后销毁 在Java中,根据配置的不同,对象可以保留在内存中,或者与单个用户关联(通过服务器会话),或者在多个用户之间共享 Node.js中是否有此方面的一般规则? 我看到许多项目实例化了entry脚本中的所有应用程序对象,在这种情况下,它们将在请求之间共享 其他人将在函数中保留对象创建,因此在处理每个请求后,AFAIK对象将被销毁 每种方法的缺点是什么?显然,应该考虑内存使用和信息共享之类的问题,但是我们是否还应该注意Node.js特有的其他问

我知道在PHP中,会为每个请求创建对象,并在处理完成后销毁

在Java中,根据配置的不同,对象可以保留在内存中,或者与单个用户关联(通过服务器会话),或者在多个用户之间共享

Node.js中是否有此方面的一般规则?

我看到许多项目实例化了entry脚本中的所有应用程序对象,在这种情况下,它们将在请求之间共享

其他人将在函数中保留对象创建,因此在处理每个请求后,AFAIK对象将被销毁


每种方法的缺点是什么?显然,应该考虑内存使用和信息共享之类的问题,但是我们是否还应该注意Node.js特有的其他问题?

Javascript没有绑定到给定请求的对象。语言是垃圾收集的,当不再有对它们的引用并且没有代码可以访问它们时,所有对象都是垃圾收集的。这与请求处理程序完全无关

因此,在处理每个请求后,AFAIK对象都会被销毁

不。Javascript中对象的生存期与请求完全无关

相反,请考虑函数作用域。如果您在请求处理程序中创建一个对象,并在该请求处理程序中使用它,而不是将其存储在某个位置,从而创建对该对象的持久引用,那么就像Javascript中的任何其他函数一样,当该请求处理程序函数完成并返回,并且不再有异步操作仍在进行时,然后,垃圾收集器将清除在该函数中创建的、未存储在其他作用域中的任何对象

请求处理程序的规则与语言中任何其他函数调用的规则完全相同

所以,请忘记您对PHP的任何了解,因为它的特定于请求的体系结构只会让您在Javascript/node.js中陷入困境。node.js中没有这样的东西

相反,可以将node.js服务器看作是一个带垃圾收集器的长时间运行的进程。当实时代码无法访问创建的所有对象时(例如,没有任何代码可以访问的对它们的实时引用),将对它们进行垃圾收集。无论对象是在服务器启动时创建的,还是在服务器上的请求处理程序中创建的,还是在服务器上的循环计时器中创建的,或者在服务器上的任何其他事件中创建的,都是相同的。该语言有一个垃圾收集器,它在任何地方都工作相同,对于服务器请求没有特殊行为

在node.js服务器中执行操作的通常方法是创建对象,这些对象是请求处理程序函数(或它调用的任何函数)中的局部变量,或者偶尔指定为
请求
响应
对象的属性(中间件通常会这样做)。由于在完成该函数调用时,所有内容都被限定为请求链中的函数调用,因此在这些函数中创建为局部变量的内容将符合垃圾收集的条件

通常,除了有目的的长期存储(会话状态、数据库连接或其他服务器范围的状态)之外,您不会在请求处理程序之外使用许多范围更广的变量

Node.js中是否有此方面的一般规则

这并不是你所问的那样,因为Javascript实际上只是一个变量在其中声明的范围,然后从那里进行垃圾收集,但我将在下面提供一些指导

如果数据存储在高于请求处理程序的作用域(模块作用域或全局作用域)中,那么它可能会持续很长时间,因为将来的请求处理程序可以访问一个持久的引用,所以它不会被垃圾收集

如果对象是在请求处理程序中创建和使用的,并且没有附加到任何更高的作用域,那么当函数执行完毕时,语言将自动对它们进行垃圾收集

会话框架通常创建一种特定的机制来存储服务器端状态,该状态在服务器上以每个用户为单位持续存在。一个流行的node.js会话管理器,
express session
就是这样做的。在这里,您将遵循会话框架的规则,了解如何从每个用户的会话中存储或删除数据。这不是真正的语言特性,因为它是语言中构建的特定库。甚至会话管理也依赖于垃圾收集器。如果需要,数据将保留在会话管理器中,因为存在对数据的持久引用,以使其可供将来的请求使用

node.js在语言或环境中没有“每用户”或“每请求”数据。会话管理器通过生成可在每个用户的基础上请求或访问的持久数据,人工构建“每个用户”数据

node.js的一些一般规则:

  • 在您的头脑和设计中定义哪些数据是特定请求处理程序的本地数据,哪些数据用于长期存储,哪些数据用于特定于用户的会话。你应该非常清楚这一点

  • 永远不要将特定于请求的变量放入任何其他请求处理程序可以访问的更高范围,除非这些变量是有意由多个请求访问的共享变量。在请求之间意外地共享变量会造成并发问题和争用条件,并且很难跟踪服务器错误,因为一个请求可能会在执行任务时写入该变量,然后另一个请求可能会出现并写入该变量,从而破坏第一个请求的工作。将这些特定于请求的变量保持为请求处理程序的本地变量(请求处理程序的函数的本地变量),这样就永远不会发生

  • 如果您存储数据以供长期使用(请