Node.js 需要节点模块中另一个依赖项的依赖项

Node.js 需要节点模块中另一个依赖项的依赖项,node.js,mongoose,npm,node-modules,Node.js,Mongoose,Npm,Node Modules,我有一个简单的节点应用程序,它依赖于github上的另一个应用程序。依赖项安装在npm install中很好,但是当我试图要求在那里安装一些东西时,它说它不可用。例如,github应用程序将Mongoose作为依赖项安装。我认为此父应用程序将能够访问该模块,因为它位于子模块中: var mongoose = require('mongoose') 结构看起来像这样: /app /node_modules /github_dependency [parent module]

我有一个简单的节点应用程序,它依赖于github上的另一个应用程序。依赖项安装在
npm install
中很好,但是当我试图要求在那里安装一些东西时,它说它不可用。例如,github应用程序将Mongoose作为依赖项安装。我认为此父应用程序将能够访问该模块,因为它位于子模块中:

var mongoose = require('mongoose')
结构看起来像这样:

/app
  /node_modules
    /github_dependency [parent module]
      /node_modules
        /mongoose [child module]
我是否需要将mongoose作为依赖项也包含在父应用程序中,或者是否有办法通过子应用程序访问该模块

我是否需要将mongoose作为依赖项也包含在父应用程序中,或者是否有办法通过子应用程序访问该模块


虽然您可以例如
require('github/node_modules/mongoose')
,但标准做法是显式安装所有依赖项(即,您应该将mongoose作为应用程序的依赖项)和
require('mongoose')
,,以获得更健壮的情况,这在测试等情况下是很好的,您可以使用以下功能:

var Module = require('module');
var path = require('path');

function requireFrom(self, parent, name) {
  var pPath = Module._resolveFilename(parent, self);
  var m = new Module(pPath, module);
  m.filename = pPath;
  m.paths = Module._nodeModulePaths(path.dirname(pPath));
  return m.require(name);
}
可按如下方式使用

requireFrom(module, 'github_dependency', 'mongoose')

谢谢你,我们将遵循这个惯例。我确实想提到的一件事是,从理论上讲,这可能会导致项目中存在多个重复的依赖关系?这是可能的,并且在一个节点项目中通常会有多个不同模块(及其版本)的实例。这是npm IMO的优势之一,在本世纪的大部分时间里,npm IMO都在解决不同Java容器的类装入器中的问题……使用这种技术有很好的理由。如果您需要('github/node_modules/mongoose'),那么您使用的是github使用的同一个mongoose实例,因此您可以共享它的连接池。此技术对于确保使用相同的版本也很有用。不能保证依赖关系将存在于嵌套的
节点\u模块中。IIUC,如果另一个模块使用相同版本的依赖项,它可能会被提升到根
节点\u modules
。我想说的是,如果您控制上游项目,并且它正在处理mongoose逻辑,即一种特殊的orm情况,应该让上游项目明确地解决依赖关系,而定制mongoose orm模块的所有使用者都应该使用在所述定制mongoose模块中定义的mongoose版本。在这种情况下,由于您无法控制上游项目,因此应该明确定义依赖项。
self
参数应该是什么?我无法从上下文判断。^忽略我的评论。我是nodejs n00b,没有意识到
module
本身就是一个保留关键字!!!请注意,它不是保留关键字,而是通过包装器自动添加的每个模块的内置变量。