【问题标题】:How to get current domain address in sails.js如何在sails.js 中获取当前域地址
【发布时间】:2014-05-13 08:12:07
【问题描述】:

我尝试使用sails.js 获取当前网址。

我尝试了以下方法:

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

返回未定义。

req.headers.host

返回 localhost。 但我的域不是 localhost。

如何获得??

【问题讨论】:

    标签: node.js sails.js


    【解决方案1】:

    只是作为这个答案的序言:没有可靠的跨平台方法来自动检测正在运行的 Sails 应用程序(或任何其他 Node 应用程序)的外部 URL。下面描述的getBaseUrl() 方法结合使用用户提供的 和默认配置值来对应用程序的URL 做出最佳猜测。在任务关键的情况下,建议您预先确定 URL 并将其保存在自定义的 environment-dependent configuration value(例如 sails.config.appUrl)中,您可以在应用程序的其他地方引用。

    如果您使用的是 Sails >= v0.10.x,您可以使用 sails.getBaseurl() 来获取您的应用所使用的完整协议、域和端口。从 Sails v0.10.0-rc6 开始,这还会检查 sails.config.proxyHostsails.config.proxyPort,如果您的应用程序通过代理(例如如果它部署在 Modulus.io 上,或者通过 Nginx 服务器代理)。

    Sails v0.9.x 没有sails.getBaseurl,但您始终可以尝试复制代码并自己实现,可能在service 中:

    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;
    };
    

    【讨论】:

    • 它返回 localhost.. 有没有办法获取被提升应用程序的 IP 地址??
    【解决方案2】:

    在 Sails v0.10 中,您可以在视图中通过 req.baseUrlsails.getBaseurl() 访问它。

    【讨论】:

    • 这对我有用,似乎比其他答案最简单快捷
    【解决方案3】:

    我尝试了一些我在 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
    

    它似乎在工作,但正如您所见,它是一个 IPv6 ip 地址,所以这不是我想要的。

    并且返回的示例编号 3:

    187.214.247.196
    

    那太好了,因为这正是我所需要的。

    我要说的是,示例 3 运行良好,但只是在生产环境中(使用 Heroku)而不是在我的本地机器上进行开发。

    【讨论】:

      【解决方案4】:

      req.host 应包含主机值。

      【讨论】:

      • req 下没有宿主对象,retuns undefined。
      • 你的意思是 req.headers.host。但这总是返回 localhost :(
      • 我刚刚对此进行了测试以确保它在 Sails 0.9.x 上对我来说工作正常
      • 查看 0.10 代码,这似乎可以肯定地工作。您还可以检查应该包含 configured 主机名的 sails.config.host。如果您不直接访问 node.js 进程,那么例如 nginx 可能会对此进行卷积,从而弄乱sails.js 中的检测
      【解决方案5】:

      在sails 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”参数的 /api/services/someservice.js 中存储的服务模块中实现它?因为它没有关联到一个 url 请求。
      • 这取决于您如何构建服务。在某些情况下,我只是将baseURL 作为参数传递给他的服务(假设它是从控制器调用的)。在其他情况下,我会像这样在服务中做一些愚蠢的事情:var baseUrl = (process.env.NODE_ENV=='development') ? 'http://localhost:133/' : 'https://myappexamplesite.com'
      【解决方案6】:

      这是我用于获取任何基于 Node.js 的服务器 IP 的代码,它适用于 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);
        }
      ...
      

      【讨论】:

        猜你喜欢
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2017-11-29
        • 2018-01-10
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        相关资源
        最近更新 更多