【问题标题】:Is it possible to 'share' functions between multiple Node.js express servers?是否可以在多个 Node.js Express 服务器之间“共享”功能?
【发布时间】:2020-10-30 13:52:36
【问题描述】:

我有两个独立的 node.js express 服务器在不同的端口上运行。

  • 在端口 5000 上运行一个身份验证 API,用于处理注册、登录和会话验证。
  • 在端口 6000 上运行一个产品 API,用于处理产品的 CRUD 操作。

当我创建一个新产品时,我想验证在请求标头中找到的令牌,因此我没有从授权 API 复制会话验证方法,而是导入了它,但由于某种原因,我在启动应用时的控制台: Error: listen EADDRINUSE: address already in use :::5000

授权API导出方法:

export const verifySessionToken = async (sToken: string) => { ... }

Products API 导入方法:

import { verifySessionToken } from '../../../auth/common/verify-session';

如果我从上面注释掉导入,应用程序会再次运行。

是否甚至可以从运行在不同端口上的节点应用程序导入方法? 如果是,正确的做法是什么?

万分感谢!

【问题讨论】:

  • 您想直接从一个代码库导入到另一个代码库?拆分功能的正确方法是将所述功能放在自己的模块中。

标签: node.js typescript express


【解决方案1】:

我认为您不能运行共享相同文件的两台服务器。为什么不直接在其他应用中复制您的功能?

【讨论】:

  • @DaveNewton - 我们一直在不同进程之间共享代码。您使用的任何 NPM 模块都可以轻松地同时在许多不同的应用程序中使用。这样做的危险为零,并且适当的模块化有很多好处。您必须设计一个没有意外副作用的适当共享模块,但这需要大约 2 分钟才能将共享代码移动到它自己的文件,然后只需从两个不同的地方使用该文件。比维护相同代码的两个副本要好得多。
  • 您问:为什么不直接在其他应用中复制您的功能?。答案是因为那时您要维护相同代码的两个单独副本。共享模块几乎总是一种更好的代码结构方式,因此您只需维护一份代码副本。
  • @jfriend00 这当然不是“零危险”,因为这样做需要人工干预,而将其放入适当的模块中可以消除这种开销,尽管开销很小。虽然我已经做到了(现在仍然这样做),但它肯定不是我的首选机制,如果没有其他原因,我不必控制我的代码在哪些机器上运行。
  • @DaveNewton - 如果您正在创建共享模块,您可以控制您需要控制的所有内容。只是不要将任何与您共享的代码无关的模块初始化副作用放在模块中。这真的,真的很容易。一旦你学会了如何正确地去做,就没有任何风险。而且,正确地执行它就像将一个函数放入文件中并导出该函数一样简单(正如我在此处的回答中所示)。而且,正确地做这件事是学习如何做的一件非常有用的事情。
  • @DaveNewton - 这就是您使用模块/库、GitHub 等源代码存储库和版本控制的目的。共享公共代码而不是复制公共代码有巨大的维护优势。通过适当的模块管理,您只能在需要并且有理由将项目升级到模块的较新版本时,但是当您这样做时,维护工作基本上已经为您完成了。
【解决方案2】:

首先,您从模块中导入函数。您不会从服务器导入方法。而且,在同一个nodejs进程或不同nodejs进程中导入相同的函数以在两个单独的服务器中使用是完全可行的。从模块导入某些东西的过程与服务器或服务器运行的端口完全无关。您只是从稍后可以调用的文件中导入函数引用。

您确实需要确保您的代码已正确模块化,以便导入函数的过程不会产生任何意外的副作用,例如尝试启动您不想启动的另一台服务器。那么,也许您的函数没有正确模块化(放入自己的可共享模块中)?

甚至可以从运行在不同端口上的节点应用程序导入方法吗?如果是,正确的做法是什么?

是的。如果您正确创建模块并确保它没有任何意外的副作用,这将非常容易。如果您向我们展示您要从中导入的整个模块,我们可能会帮助您确定您做错了什么。

仅供参考,请输入以下内容:

export const verifySessionToken = async (sToken: string) => { ... }

在它自己的文件中,两个地方都可以使用它然后导入它。

【讨论】:

  • 谢谢你,朋友! :) 你已经成功地在很多事情上启发了我。我已经设法通过将 verifySessionToken 函数分离到它自己的文件中来导入它,包括与之相关的所有其他函数。因此,该错误是由位于应用程序侦听端口的主 index.ts 文件中的函数引起的。
猜你喜欢
  • 2011-05-07
  • 2012-11-28
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
相关资源
最近更新 更多