Вопрос по node.js, express – Может ли размещенное на iisnode веб-приложение определить виртуальный путь, по которому оно размещено?

6

я используюiisnode разместить узел веб-приложения в IIS на Windows. Когда я настраиваю свои маршруты на веб-сервере (скажем, Express или Restify), я хочу сделать это способом, который не зависит от пути, по которому IIS размещает приложение.

Например, мое приложение может быть размещено в двух разных путях на двух машинах с IIS; первый мог провести его в/foo а второй в/bar, Скажем, мое приложение хочет настроить маршрут в/baz - на первой машине мне нужно будет настроить маршрут на/foo/baz а на втором мне пришлось бы использовать/bar/baz что означает дублирование некоторых настроек, хранящихся в IIS.

Можно ли надежно определить путь из приложения, размещенного на iisnode, чтобы я мог рассчитать правильные маршруты для настройки? Или есть другой метод, который я могу использовать, чтобы избежать необходимости делать это?

Ваш Ответ

4   ответа
2

@GraemeF: Это немного глупо, но это то, что я обошел этим ограничением.

Сначала я добавил в приложение глобальную переменную под названием home:

var express = require('express'),
    app = express.createServer(),
    home = process.env.deployPath || '';

Затем я настроил свои маршруты, используя переменную home:

app.get(home + '/baz', function(req, res) {
    res.send('This is the /baz route');
    res.end();
});

Затем нужно просто установить параметр deployPath appSetting в ваших приложениях web.config:

Машина 1:

<appSettings>
    <add key="deployPath" value="/foo" />
</appSettings>

Машина 2:

<appSettings>
    <add key="deployPath" value="/bar" />
</appSettings>

Вы можете вручную установить значение на каждом компьютере, настроить его в процессе сборки или даже добавить параметр в глобальный web.config целевого компьютера.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded GraemeF
Error: User Rate Limit Exceeded
3

Я не знаю, как избежать сегмента пути, соответствующего виртуальному каталогу в вашем приложении node.js, размещенном в iisnode. Лучший способ убедиться, что код вашего приложения не зависит от хоста, - разместить его в корне веб-сайта IIS.

Error: User Rate Limit Exceeded GraemeF
Error: User Rate Limit Exceeded
1

Этот ответ предлагает получить путь отweb.config файл.

Также,эта ссылка может быть полезной:

The solution turns out to be well addressed, at least for "express" framework apps using app.use()

When you call app.use(app.router), you can pass a namespace prefix for your virtual directory and then requests will succeed BUT who would want to hard-code their virtual directory name into their app [yuck!]?

The solution turns out to be quite simple because IISNODE promotes appSettings to environment variables. Taking advantage of this fact, you can add an entry to the apps web.config such as:

<appSettings>
        <add key="appvirtdir" value="/nodetest" />
</appSettings>

Then you can make one simple modification to your server.js file like this:

app.configure(function () {
....
    app.use(process.env.appvirtdir || '', app.router);
....
});
0

Оба выражения и restify позволяют определять пути с помощью регулярных выражений. Используя пути регулярных выражений, вы можете полностью избежать проблем с префиксами.

Вместо

server.get({ path: '/virtual/directory/structure/status/',...

использование

server.get({ path: /.*\/status/,...

и не будет никакой необходимости в магии.

Похожие вопросы