Получить доступ к Express mountpath изнутри модуля

65
8

В попытке создать действительно модульное экспресс-приложение (которое может работать автономно или как часть другого приложения) мне нужно выяснить самый чистый способ найти путь монтирования изнутри subapp. Например, скажем, что есть два файла: 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 изнутри шаблона с использованием экспресс-кода не проводным способом.

Как показано в примере, он уже не успел с помощью app.mountpath

спросил(а) 2021-01-19T16:05:02+03:00 9 месяцев назад
1
Решение
79

Как ответил alsotang, на самом деле это проблема последовательности выполнения, но она может быть решена в том, что я считаю чистым. Событие запускается после установки модуля, поэтому вы можете сделать следующее:

var truePath = = "/";

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

Где в реальной жизни truePath может быть app.locals.truePath, поэтому он может быть доступен изнутри представлений.

ответил(а) 2021-01-19T16:05:02+03:00 9 месяцев назад
47

Попробуйте 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;

ответил(а) 2021-01-19T16:05:02+03:00 9 месяцев назад
46

Это проблема последовательности выполнения.

В вашем subapp.js оператор app.mountpath находится перед module.exports = app.

Но только вы экспортируете приложение, затем приложение будет смонтировано, тогда будет установлено свойство mountpath.

поэтому, вы должны получить mountpath после того, как приложение будет установлено внешним экспрессом.

Мое предложение - два:

установите путь к монтировке в вашем subapp.js. И внешний экспресс читал это свойство. возможно, вы думаете, что 1 не является действительно модульным. так что вы можете альтернативно определить файл конфигурации. и как main.js, так и subapp.js читают путь монтирования из config.

ответил(а) 2021-01-19T16:05:02+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема