Node JS 返回主机名

76

我仍在学习 Node JS 和 JavaScript 并且有一个应用程序。我有一个配置文件,需要获取 Ubuntu 12.04 服务器的主机名。

我尝试了以下内容:

 window.location.hostname

但是那并没有起作用。以下是示例代码:

exports.config = {
    app_name : [ window.location.hostname ]
}
如果我使用字符串,它会加载得很好,但这将通过 Github 进行管理,并且在应用程序加载时需要区分。

1
请尝试访问http://davidcaylor.com/2012/05/24/finding-the-hostname-in-node-js/,该网站与Node.js有关。 - Mörre
1
可能是在node.js Express中获取当前请求的主机名的重复问题。 - Vince
3个回答

156
根据 Node.js的“os”模块文档 ,您需要加载“os”模块,该模块具有一个hostname()函数:
var os = require("os");
var hostname = os.hostname();

然而,那只是主机名 - 不带域名(FQDN)。没有简单的方法来获取FQDN。您可以使用node.js DNS函数尝试将服务器的IP地址(使用os.networkInterfaces()获取,参见上面的文档链接)转换为名称。唯一的问题是服务器可能具有不同的接口和名称,因此您必须决定要使用哪个。

您尝试使用window对象,但这仅存在于浏览器的JavaScript运行时环境中。显然,服务器端JavaScript没有窗口,因此没有window对象。请参阅此问题:“Node.js是否有与浏览器中的window对象等效的对象”

有了这些信息,您的问题有点奇怪 - 在浏览器中,window.location.hostname是当前页面加载的URL的主机部分。如何将其转换为服务器上下文?您在node.js上运行的代码就是从该服务器上运行的定义,因此实际上您不需要此信息。您可能需要它在浏览器中,因为该信息是可变的,特别是当您运行混搭(来自各种来源的JS代码)时,您的代码可能不知道加载页面的位置。在服务器上,您始终知道它是在本地文件系统中。

顺便说一下,您始终可以使用localhost作为主机名:)


我应该澄清一下。我需要这个名称将数据发送到远程源,并需要区分它来自哪台服务器。如果在Linux中运行命令'hostname',它将返回服务器名称。我希望将此名称传递到我的配置中,以便当它发送数据时,我可以根据运行它的服务器组进行组织。 - nocode
1
@nocode 你没有澄清任何事情,因为如果按照上述描述使用 os.hostname(),你会得到主机名,就像使用命令行命令 hostname 一样。如果你需要在 HTTP 连接中获取远程主机,那么你的问题已经被合理地标记为“重复”,而你所有的“主机名”相关内容都是完全错误的!基本上,在同一个句子中,你所说的是你需要本地主机名,而不是远程主机名。下定决心吧 :) - user3062321
2
你没有理解。该应用程序正在将本地主机名和其他服务器统计信息作为数据发送到远程源。假设我的环境有10个服务器。这10个服务器将向远程源发送数据,我需要一种定义这10个服务器的主机名的方法,以便我可以区分它们。我可以手动编写此内容,但需要自动化。这与从浏览器获取数据无关。 - nocode
1
非常好 - 现在使用 os.hostname() 查找主机名。如果这不是你想要的,你应该考虑将问题呈现给其他人,这就是这个唯一答案的原因。如果“重复”内容的引用也没有帮助到你,那么你应该问自己一个问题:*(我留下这个问题)* 对我来说,我没有其他可添加的内容,所以不需要回复。 - user3062321
4
os.hostname() 返回的操作系统主机名与 HTTP 请求中的主机名部分完全无关。 - Vince
显示剩余3条评论

21

只有当你使用http.createServer运行服务器时,才能获取与window.location.hostname相同的主机名。在这种情况下,主机名是请求对象的属性之一:

request.headers.host

我很想为这个回答承担责任,但我只是因为不知道答案才来到这里。我在这个SO答案中找到了答案。


0

Vince的答案是错误的。 request.headers.host 是客户端在 Host 标头中传递的值。

除非服务器配置了基于名称的虚拟主机,否则可以将其设置为类似完全限定域名的任何内容。在 Node 中,您可以将其设置为任何您想要的内容或甚至省略它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接