node.js并在重定向后处理数据

node.js并在重定向后处理数据,node.js,express,Node.js,Express,我有一个用Node.js+Express编写的应用程序,可以处理传入的数据并将客户重定向到其他地方。问题是处理可能需要一段时间(大部分与统计数据相关,因此特定于地理位置的数据+数据库查找),因此从概念上来说,捕获必要的标题(用于数据处理)、发送301/302标题并然后处理捕获的数据是否正确?目标是尽可能快地重定向客户,而不是让他们在处理完成时等待,因为处理本身与重定向无关(我们可以假设目标URL是固定的) 例如: 是的,这很好,假设processData是异步的(几乎可以肯定它已经是异步的),以

我有一个用Node.js+Express编写的应用程序,可以处理传入的数据并将客户重定向到其他地方。问题是处理可能需要一段时间(大部分与统计数据相关,因此特定于地理位置的数据+数据库查找),因此从概念上来说,捕获必要的标题(用于数据处理)、发送301/302标题并然后处理捕获的数据是否正确?目标是尽可能快地重定向客户,而不是让他们在处理完成时等待,因为处理本身与重定向无关(我们可以假设目标URL是固定的)

例如:


是的,这很好,假设processData是异步的(几乎可以肯定它已经是异步的),以避免阻塞Express服务器。随着系统规模的增大,你应该考虑将PrimeDATA函数调度到一个队列中,在这些队列中,它们可以由附加的机器来处理。签出并。

您可以这样做,这几乎类似于在post pone操作中使用“设置超时”

"Node.js" is single threaded
但是您必须记住“Node.js”是单线程的。因此,此操作“processData(ua,ip)”可能是阻止来自相同或不同HTTP客户端的后续请求。如果“processData(ua,ip)”不包括任何文件、网络、数据库或任何端口读/写操作,则无法利用非阻塞IO。所以,即使您的方法在本地环境中运行良好,也不适合生产

Alternate way

所以,要完成繁重的流程,请使用您的输入创建子流程,并让它完成。更好的是,您必须尽可能减少主进程(即侦听端口的进程)的工作负载。

为了清楚起见,请将最后一行更改为setTimeout(function(){processData(ua,ip)},0);这将允许express函数返回,而无需等待processData。只要完成的工作基本上是io绑定的,你可能就可以去了。如果processData中有一个大型javascript计算,那么您需要查看替代方案。有什么线索可以告诉我如何分支到子进程吗?您可以使用我选择的“永久模块”来完成。
Alternate way