Как получить текущий адрес домена в sails.js

Я пытаюсь получить текущий веб-адрес, используя sails.js.

Я попробовал следующее:

req.param('host') and req.param('X-Forwarded-Protocol') 

возвращает неопределенное.

req.headers.host

возвращает localhost. но мой домен не является localhost.

Как получить его??

6 ответов

Просто в качестве предисловия к этому ответу: не существует надежного кроссплатформенного способа автоматического определения внешнего URL-адреса работающего приложения Sails (или любого другого приложения Node). getBaseUrl() метод, описанный ниже, использует комбинацию предоставленных пользователем и значений конфигурации по умолчанию, чтобы сделать правильное предположение по URL-адресу приложения. В критических ситуациях рекомендуется предварительно определить URL-адрес и сохранить его в настраиваемом параметре конфигурации, зависящем от среды (например, sails.config.appUrl) что вы можете ссылаться в другом месте в приложении.

Если вы на Sails >= v0.10.x, вы можете использовать sails.getBaseurl() чтобы получить полный протокол, домен и порт, с которого обслуживается ваше приложение. Начиная с Sails v0.10.0-rc6, это также проверяет sails.config.proxyHost а также sails.config.proxyPort, который вы можете установить вручную в одном из ваших файлов конфигурации (например, config/local.js) если ваше приложение обслуживается через прокси-сервер (например, если оно развернуто на Modulus.io или прокси-сервер через сервер Nginx).

Паруса v0.9.x не имеет sails.getBaseurl, но вы всегда можете попробовать скопировать код и реализовать себя, вероятно, в службе:

getBaseUrl

function getBaseurl() {
  var usingSSL = sails.config.ssl && sails.config.ssl.key && sails.config.ssl.cert;
  var port = sails.config.proxyPort || sails.config.port;
  var localAppURL =
    (usingSSL ? 'https' : 'http') + '://' +
    (sails.getHost() || 'localhost') +
    (port == 80 || port == 443 ? '' : ':' + port);

  return localAppURL;
};

вы заметите, что это зависит от sails.getHost(), который выглядит как:

function getHost() {
  var hasExplicitHost = sails.config.hooks.http && sails.config.explicitHost;
  var host = sails.config.proxyHost || hasExplicitHost || sails.config.host;
  return host;
};

В Sails v0.10 вы можете получить к нему доступ через req.baseUrl или же sails.getBaseurl() в ваших взглядах..

Я попробовал несколько примеров, которые я нашел в Google, но, похоже, ничего не работает, по крайней мере, на моем локальном компьютере.

  1. Использование этого в моей локальной машине вернуло:

    req.ip;  -->  ::1
    
  2. Использование этого в моей локальной машине вернуло:

    req.headers['x-forwarded-for'];  -->  undefined
    
  3. Наконец, с помощью этого в моей локальной машине возвращено:

    var paramIp = req.headers['x-forwarded-for'] ||
                req.connection.remoteAddress ||
                req.socket.remoteAddress ||
                req.connection.socket.remoteAddress;  -->  ::1
    

Казалось, ничего не работает. Тогда я попробовал в production environment и первый пример вернулся:

req.ip;  -->  ::ffff:10.155.43.243

Кажется, он работает, но, как вы можете видеть, это IP-адрес IPv6, так что это не то, что я хотел.

И пример № 3 вернулся:

187.214.247.196

Так что это отлично, потому что это то, что мне было нужно.

Все, что я должен сказать, это то, что пример № 3 работал нормально, но только в производственной среде (с использованием Heroku), а не для разработки на моей локальной машине.

На паруса 0.10.x вы можете сделать это:

//inside controller action
var baseURL = req.protocol + '://' + req.host;

req.protocol даст вам "http" или "https" (или любой другой протокол приложения). req.host будет заголовком хоста, например, "sub.domain.com"

Как отмечено в комментарии выше, sails.getBaseURL() или любой из его вариантов обычно возвращает localhost, даже в производственной среде.

req.host должен содержать значение хоста.

Это код, который я использую для получения IP-адреса любого сервера на основе Node.js, и он работает с Sails.js:

var os = require('os');
....
  getIpAddress: function() {
    var ifaces = os.networkInterfaces();
    for (k in ifaces) {
      for (k2 in ifaces[k]) {
        var address = ifaces[k][k2];
        if (address.family == 'IPv4' && !address.internal) {
          return(address.address);
        }
      }
    }
    return(null);
  }
...
Другие вопросы по тегам