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