在node.JS我怎么能得到一个模块的path,我已经加载通过要求是*不*我的(即在一些node_module)

我需要一个通过npm安装的模块。 我想访问一个.js文件从属于该模块(所以我可以inheritance一个构造函数的方法)。 我不能(很好,不想)修改模块的代码,所以没有一个地方来提取__dirname。

我知道下面的问题,但它是关于获取模块的代码控制的path(因此,__dirname是解决scheme): 在Node.js中,我怎么能告诉`this`模块的path?

~~~

更好的办法是获取模块的加载模块信息

如果我正确理解你的问题,你应该使用require.resolve() :

使用内部的require()机制来查找模块的位置,而不是加载模块,只是返回parsing的文件名。

例如: var pathToModule = require.resolve('module');

我希望我正确理解你的需求:获得某个模块的入口点文件。 假设你想获得jugglingdb模块的入口点:

 node > require('module')._resolveFilename('jugglingdb') '/usr/local/lib/node_modules/jugglingdb/index.js' 

正如你所看到的,这不是“官方”的方式来获取这种关于模块的信息,所以这个函数的行为可能会从一个版本变为另一个版本。 我发现它在节点源: https : //github.com/joyent/node/blob/master/lib/module.js#L280

根据@anatoliy解决scheme,在MacOS XIfind了查找path

 require('module')._resolveLookupPaths('myModule') 

所以我得到解决的查找path

 [ 'myModule', [ '/Users/admin/.node_modules', '/Users/admin/.node_libraries', '/usr/local/lib/node' ] ] 

 require('module')._resolveFilename('myModule') 

不会解决我正在寻找反正的模块,事实上,疯狂的事情是_load不会parsing模块:

 > require('module')._load('myModule') Error: Cannot find module 'myModule' at Function.Module._resolveFilename (module.js:440:15) at Function.Module._load (module.js:388:25) at repl:1:19 at sigintHandlersWrap (vm.js:32:31) at sigintHandlersWrap (vm.js:96:12) at ContextifyScript.Script.runInContext (vm.js:31:12) at REPLServer.defaultEval (repl.js:308:29) at bound (domain.js:280:14) at REPLServer.runBound [as eval] (domain.js:293:12) at REPLServer.<anonymous> (repl.js:489:10) 

require将会:

 > require('myModule') 

但我没有这个模块

 myProject/node_modules/ myProject/node_modules/@scope/ /usr/local/lib/node_modules/ /usr/local/lib/node_modules/@scope /usr/local/lib/node_modules/npm/node_modules/ /usr/local/lib/node_modules/npm/node_modules/@scope $HOME/.npm/ $HOME/.npm/@scope/ 

那么这个模块在哪里?

首先,我必须做一个$ sudo /usr/libexec/locate.updatedb然后一些咖啡后,我locate myModule或更好地locate myModule/someFile.js

etvoilà,它出现在我的项目的父文件夹,即在我的项目根文件夹之外:

 $pwd /Users/admin/Projects/Node/myProject $ ls ../../node_modules/myModule/ 

所以你不能避免rm -rf ../../node_modules/myModule/和新鲜的npm install

我可以争辩说,没有人指示npm扫描我的计算机search模块其他地方比我的项目根文件夹,它应该运行或在默认模块searchpath。