从模块内部访问Express mountpath

时间:2015-04-10 04:17:44

标签: javascript node.js express

为了构建一个真正模块化的快速应用程序(一个可以独立运行或作为另一个应用程序的一部分运行),我需要找到从子应用程序内部找到安装路径的最简洁方法。举一个简短的例子,假设有两个文件: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;

从模块内部找到mountpath的最佳方法(如最干净)是什么?我正在尝试以非硬连线方式解决此问题:Access to mountpath variable from inside a template using express

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

3 个答案:

答案 0 :(得分:2)

正如alsotang所回答的,这实际上是执行顺序的问题,但它可以通过我认为干净的方式解决。有一个event that is fired after the module is mounted,所以你可以这样做:

var truePath = = "/";

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

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

答案 1 :(得分:0)

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

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

但只有你导出应用程序,然后安装应用程序,然后才会设置mountpath属性。

因此,您应该在外部快递安装应用程序后检索mountpath

我的建议是两个:

  1. 在subapp.js中设置mountpath。外面的快递读了这个属性。
  2. 也许你认为1不是真正的模块化。所以你也可以定义一个配置文件。 main.js和subapp.js都从配置中读取mountpath。

答案 2 :(得分:0)

尝试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;