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“
这对我来说很有效,似乎比其他答案更简单、更快