Node.js 如何在sails.js中获取当前域地址

Node.js 如何在sails.js中获取当前域地址,node.js,sails.js,Node.js,Sails.js,我正在尝试使用获取当前网址 我尝试了以下方法: req.param('host') and req.param('X-Forwarded-Protocol') 返回未定义的。 req.headers.host 返回localhost。但我的域不是localhost 如何获取它???请求主机应包含主机值 只需在回答这个问题之前说明一下:没有可靠的跨平台方法可以自动检测正在运行的Sails应用程序(或任何其他节点应用程序)的外部URL。下面描述的getBaseUrl()方法使用用户提供的和默认

我正在尝试使用获取当前网址

我尝试了以下方法:

req.param('host') and req.param('X-Forwarded-Protocol') 
返回未定义的。

req.headers.host
返回localhost。但我的域不是localhost


如何获取它???

请求主机应包含主机值

只需在回答这个问题之前说明一下:没有可靠的跨平台方法可以自动检测正在运行的Sails应用程序(或任何其他节点应用程序)的外部URL。下面描述的
getBaseUrl()
方法使用用户提供的和默认配置值的组合来对应用程序的URL进行最佳猜测。在关键任务情况下,建议您预先确定URL,并将其保存在自定义(例如,
sails.config.appUrl
)中,您可以在应用程序的其他地方引用该URL

如果您使用的是Sails>=v0.10.x,则可以使用
Sails.getBaseurl()
获取应用程序服务的完整协议、域和端口。从Sails v0.10.0-rc6开始,这也会检查
Sails.config.proxyHost
Sails.config.proxyPort
,如果您的应用程序是通过代理服务的(例如,如果它部署在module.io上,或通过Nginx服务器代理),您可以在您的一个配置文件(如
config/local.js
)中手动设置

Sails 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()
访问它。

在Sails 0.10.x中,您可以执行以下操作:

//inside controller action
var baseURL = req.protocol + '://' + req.host;
req.protocol
将为您提供“http”或“https”(或任何应用程序协议)<代码>请求主机将是主机的标题,例如“sub.domain.com”


如上面的评论所述,
sails.getBaseURL()
或它的任何变体通常会返回localhost,即使在生产环境中也是如此。

我尝试了一些在google中找到的示例,但至少在我的本地机器上似乎没有任何效果

  • 在我的本地计算机中使用此返回:

    req.ip;  -->  ::1
    
    req.headers['x-forwarded-for'];  -->  undefined
    
    var paramIp = req.headers['x-forwarded-for'] ||
                req.connection.remoteAddress ||
                req.socket.remoteAddress ||
                req.connection.socket.remoteAddress;  -->  ::1
    
    req.ip;  -->  ::ffff:10.155.43.243
    
    187.214.247.196
    
  • 在我的本地计算机中使用此返回:

    req.ip;  -->  ::1
    
    req.headers['x-forwarded-for'];  -->  undefined
    
    var paramIp = req.headers['x-forwarded-for'] ||
                req.connection.remoteAddress ||
                req.socket.remoteAddress ||
                req.connection.socket.remoteAddress;  -->  ::1
    
    req.ip;  -->  ::ffff:10.155.43.243
    
    187.214.247.196
    
  • 最后,在我的本地计算机中使用此命令返回:

    req.ip;  -->  ::1
    
    req.headers['x-forwarded-for'];  -->  undefined
    
    var paramIp = req.headers['x-forwarded-for'] ||
                req.connection.remoteAddress ||
                req.socket.remoteAddress ||
                req.connection.socket.remoteAddress;  -->  ::1
    
    req.ip;  -->  ::ffff:10.155.43.243
    
    187.214.247.196
    
  • 似乎什么都没用。然后我在
    生产环境中进行了尝试,第一个示例返回:

    req.ip;  -->  ::1
    
    req.headers['x-forwarded-for'];  -->  undefined
    
    var paramIp = req.headers['x-forwarded-for'] ||
                req.connection.remoteAddress ||
                req.socket.remoteAddress ||
                req.connection.socket.remoteAddress;  -->  ::1
    
    req.ip;  -->  ::ffff:10.155.43.243
    
    187.214.247.196
    
    它似乎正在工作,但正如您所看到的,它是一个IPv6 ip地址,所以这不是我想要的

    示例3返回:

    req.ip;  -->  ::1
    
    req.headers['x-forwarded-for'];  -->  undefined
    
    var paramIp = req.headers['x-forwarded-for'] ||
                req.connection.remoteAddress ||
                req.socket.remoteAddress ||
                req.connection.socket.remoteAddress;  -->  ::1
    
    req.ip;  -->  ::ffff:10.155.43.243
    
    187.214.247.196
    
    这很好,因为这正是我需要的


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

    这是我用于获取基于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);
      }
    ...
    

    req下没有主机对象,其retuns未定义。您的意思是req.headers.host。但这始终返回localhost:(我只是测试了一下,以确保它能在sails 0.9.xl上正常工作。通过查看0.10代码,这似乎是肯定能工作的。您还可以检查sails.config.host,它应该保存配置的主机名。如果您不直接访问node.js进程,例如nginx可能会将其卷积起来,从而破坏检测。)n在sails.jsit中返回localhost..有没有办法获取提升应用程序的IP地址?如何在/api/services/someservice.js中存储的没有“req”的服务模块中实现这一点param?因为它与url请求没有关联。这取决于您构建服务的方式。在某些情况下,我只需将
    baseURL
    作为参数传递到服务中(假设它是从控制器调用的)。在其他情况下,我会在服务中做一些类似这样的傻事:
    var baseURL=(process.env.NODE\u env==“development”) ? 'http://localhost:133/' : 'https://myappexamplesite.com“
    这对我来说很有效,似乎比其他答案更简单、更快