NodeJS - 动态导入内置模块

NodeJS - Dynamically import built in modules

我想要一个内置模块(例如 Math 或 path 或 fs),无论是来自全局对象还是 require,我想过这样做:

function getModuleByName(name) {
     return global[name] || require(name);
}

有没有办法检查它确实是一个模块而不是其他东西?这会造成安全问题吗?

Is there a way to check that it is indeed a module and not something else?

其他方法,但这里有一个例子:

function getModuleByName(name)
{
  let module = null;
  try {
    module = require(name);
  } catch (e) {
     // Recommend Logging e Somewhere
  }
  return module;
}

这将优雅地失败,因为 null 模块不存在,或者 return 它。

Would this make a security problem?

很有可能,这取决于它的使用方式。然而,我认为这更像是一个一般的设计问题,并且会笼统地说避免这样做(没有任何上下文,你可能有一个很好的理由)。

您和任何人一样,显然可以加载的模块数量有限。这些模块都是出于特定原因由您自己为您的应用程序选择的,或者本机捆绑到您的节点版本中并且是您环境的预期部分。

您通过引入此功能所做的是在您的环境中添加 意外 元素。如果您使用 getModuleByName 访问第三方库 - 您应该完全知道该库可用,因此没有理由不能直接要求它。

--

如果您确实认为您的用例证明了这一点,请告诉我它是什么,因为我以前可能从未遇到过。我已经使用如下动态导入:

https://javascript.info/modules-dynamic-imports

但这不是针对全局 packages/libraries,而是针对应用程序内部构建的模块的动态引用(即路由到不同的视图、调用内部脚本)。

我通过将目标目录列入白名单来确保文件路径无法更改,确保每个脚本都遵循每个用例的严格接口,并在模块不存在的情况下优雅地失败(错误输出“此脚本”对于脚本用法和路由示例的 404 视图不存在”。