从模块内部访问Express mountpath

为了构build一个真正的模块化快速应用程序(可以独立运行或作为另一个应用程序的一部分运行),我需要find从子应用程序内部find安装path的最简洁的方法。 举个简单的例子,假设有两个文件:main.js和subapp.js

main.js

var express = require('express'); var app = express(); var localApp = express(); var subapp = require('./subapp'); app.use('/foo', subapp); app.use('/bar', localApp); console.log(localApp.mountpath); // yes, this prints '/bar' as expected ... 

subapp.js

 var express = require('express'); var app = express(); var truePath = app.mountpath; // I wish this would point to '/foo', but instead points to '/' ... module.exports = app; 

从模块内部findmountpath的最好方法是什么? 我正在这样做,试图解决这个问题: 使用Express以非硬连线的方式访问模板内的mountpathvariables 。

如示例中所示,已尝试使用app.mountpath而没有成功

正如阿尔苏当回答,这实际上是一个执行顺序的问题,但是我认为这是一个干净的方式。 在安装模块后会有一个事件被触发 ,所以你可以这样做:

 var truePath = = "/"; app.on('mount', function (parent) { truePath = app.mountpath; }); 

在现实生活中, truePath可以是app.locals.truePath ,因此可以从视图内部访问它。

呃..这是执行顺序的问题。

在你的subapp.js中, app.mountpath语句在module.exports = app之前。

但只有你导出应用程序,然后应用程序被挂载,那么它将被设置为mountpath属性。

所以,应用程序由外部快递安装后,您应该检索mountpath

我的build议是两个:

  1. 在你的subapp.js中设置装载path。 而外面的快车阅读这个属性。
  2. 也许你认为1并不是真正的模块化。 所以你可以select定义一个configuration文件。 并且main.js和subapp.js都从config中读取mountpath。

尝试req.baseUrl

app.js

 var express = require('express'); var app = express(); var foo = require('./foo'); app.use('/foo', foo); app.listen(3000); 

foo.js

 var express = require('express'); var router = express.Router(); router.get('/', function(req, res) { console.log(req.baseUrl); // '/foo' res.send('foo'); }); module.exports = router;