Node.js NPM-应用程序根目录的路径

Node.js NPM-应用程序根目录的路径,node.js,express,npm,Node.js,Express,Npm,我正在开发一个NPM包,它需要来自应用程序根目录的模块。将其视为需要属性模块的包,该模块由用户放置在应用程序根目录中 如何获取应用程序根目录的路径 更新: 为了总结我要做的事情,express允许您执行以下操作: app.use(express.router(myNPMModule.router)); var routes = require('./routes') app.get('/info', routes.info); //Routes Module exports.info = f

我正在开发一个NPM包,它需要来自应用程序根目录的模块。将其视为需要属性模块的包,该模块由用户放置在应用程序根目录中

如何获取应用程序根目录的路径

更新:

为了总结我要做的事情,express允许您执行以下操作:

app.use(express.router(myNPMModule.router));
var routes = require('./routes')
app.get('/info', routes.info);

//Routes Module
exports.info = function(req, res) {
  res.render('info', {title: 'Express'})
};

路由器功能将获得
app
作为参数。其思想是允许用户在一个单独的文件中指定路由,他们只需要遵循某些约定,例如将控制器放入
/controllers
文件夹,我的模块将能够动态解析路径,然后在正确的模块中调用正确的方法。我已经让它工作了,但我刚刚意识到,如果我将其打包到NPM中,我将不再能够访问应用程序的路径,因此我无法动态调用控制器模块的方法。

让用户调用设置变量的函数:

  myModule.setProps(json)
  OR
  myModule = new MyModule(json)
然后用户可以要求他们的根配置,并用它初始化您的模块

更新对已编辑问题的回复:

Express允许您定义如下所示的路线:

app.use(express.router(myNPMModule.router));
var routes = require('./routes')
app.get('/info', routes.info);

//Routes Module
exports.info = function(req, res) {
  res.render('info', {title: 'Express'})
};
我相信这正是你想要做的。不是吗

更新2:

您可以使用_dirname找到当前正在执行的脚本所在的目录

console.log(__dirname);

让用户调用设置变量的函数:

  myModule.setProps(json)
  OR
  myModule = new MyModule(json)
然后用户可以要求他们的根配置,并用它初始化您的模块

更新对已编辑问题的回复:

Express允许您定义如下所示的路线:

app.use(express.router(myNPMModule.router));
var routes = require('./routes')
app.get('/info', routes.info);

//Routes Module
exports.info = function(req, res) {
  res.render('info', {title: 'Express'})
};
我相信这正是你想要做的。不是吗

更新2:

您可以使用_dirname找到当前正在执行的脚本所在的目录

console.log(__dirname);
我有同样的问题

我只能找到以下环境变量帮助:

process.env.PWD
它总是指向它运行的应用程序路径的根。

我也有同样的问题

我只能找到以下环境变量帮助:

process.env.PWD
它总是指向运行它的应用程序路径的根。

试试这个

var path = require('path');
console.log(path.dirname(module.parent.filename));
试试这个

var path = require('path');
console.log(path.dirname(module.parent.filename));

你不应该这样做,而是让用户用属性调用“构造函数”(或任何你拥有的函数)。我正在编写一个路由器,我希望用户遵循某些约定。就像将他的控制器放在“controllers/moduleName.js”中一样,然后根据URL,我将能够调用正确的控制器和方法。这是一个路由器中间件,与您将URL映射到控制器文件路径的要求相同。您不应该这样做,而是让用户使用属性调用“构造函数”(或任何您拥有的函数)。请参阅我对另一个答案的评论。我正在编写一个路由器,我希望用户遵循某些约定。就像将他的控制器放在“controllers/moduleName.js”中一样,然后根据URL,我将能够调用正确的控制器和方法。这是一个路由器中间件,与您将URL映射到控制器文件路径的要求相同。我考虑过这一点,但我还有另一个需要,即我需要能够动态加载用户模块(例如,将请求路由到特定控制器时)。还有别的办法吗?我是否可以假设我的模块将位于我的node_modules/moduleName/lib文件夹中,并尝试进行相对访问?在程序运行时,模块中的动态访问会发生变化?或者在程序启动时动态加载到配置文件中。我已经用更多细节更新了问题。当用户输入URL时,我的模块将解析URL(基于类似rails的约定),并调用控制器模块的适当方法,其位置将遵循约定。谢谢,我最终采用了
\u dirname
方法。我认为,但我还需要能够动态加载用户模块(例如,将请求路由到特定控制器时)。还有别的办法吗?我是否可以假设我的模块将位于我的node_modules/moduleName/lib文件夹中,并尝试进行相对访问?在程序运行时,模块中的动态访问会发生变化?或者在程序启动时动态加载到配置文件中。我已经用更多细节更新了问题。当用户输入URL时,我的模块将解析URL(基于类似rails的约定),并调用控制器模块的适当方法,其位置将遵循约定。谢谢,我最终采用了
\uu dirname
方法。给了我未定义的值-1为我提供未定义的值-1.