Node.js 为什么我必须在节点web请求中包含带有URL的主机?

Node.js 为什么我必须在节点web请求中包含带有URL的主机?,node.js,express,isomorphic-fetch-api,Node.js,Express,Isomorphic Fetch Api,无论我使用哪个库作为节点,它们都需要绝对URL 这意味着我需要构建一个fetch curry,然后通过函数链传递该fetch以能够发出请求,或者我需要在确定im是在生产中还是在开发中后定义一个常量,然后在环境发生变化时更新该URL 不管怎样,为什么节点需要URL的主机名 在我的应用程序的任何地方(包括功能链的深处),是否有一种更无缝的方式来执行服务器端请求 代码示例: node index.js index.js let app = Express(); app.use('ace', (req,

无论我使用哪个库作为节点,它们都需要绝对URL

这意味着我需要构建一个fetch curry,然后通过函数链传递该fetch以能够发出请求,或者我需要在确定im是在生产中还是在开发中后定义一个常量,然后在环境发生变化时更新该URL

不管怎样,为什么节点需要URL的主机名

在我的应用程序的任何地方(包括功能链的深处),是否有一种更无缝的方式来执行服务器端请求

代码示例:

node index.js
index.js
let app = Express();
app.use('ace', (req, res) => foo());
app.use('somedata.json', (req, res) => res.status(200).send('{"hello": "world"}'));

foo.js
() => bar();

bar.js
() => bat();

bat.js
() => fetch('/somedata.json').then(console.log);

没有相对HTTP请求这样的东西。任何实际的HTTP请求都必须是完全限定的URL。这就是HTTP规范。因为HTTP是无状态的,所以没有与给定主机关联的“基本路径”状态

相对请求存在于浏览器类型的环境中,但这只是因为浏览器会预处理请求,如果请求不是绝对的,则浏览器会添加默认的基本路径以使其成为绝对的。从浏览器到服务器的所有请求实际上都是绝对URL

您可以编写自己的函数,与浏览器的功能相同。您在其上设置了一个基本路径,然后通过此函数引导所有请求,该函数检查为请求发送的URL,如果它不是完全限定的路径,则将基本路径添加到该路径中


如果您展示了您试图解决的问题的真实代码示例,我们可以更具体地帮助您。如果是开发环境或生产环境中的一种,那么您通常会在启动时根据您运行的环境类型建立一些变量,然后让您的代码在形成请求时使用这些变量。

到底是谁在不加评论的情况下投了反对票?我不理解您遇到的实际问题。在服务器端发出HTTP请求时,没有“base HREF”这样的相对值可以发出请求,因此需要绝对URL。因此express.listen不会为其他库设置任何全局值来查找相对于主机URL的相对值。这回答了我的第一个问题。它没有回答我的第二个问题“在我的应用程序中,有没有一种更无缝的方式来处理服务器端请求?”你的示例代码会创建一个无限循环。我不明白你的意思。怎么会呢?亲戚这个词用错了。我把它固定在标题里,但忘了固定在正文里。我不喜欢必须指定主机名。我添加了一个代码示例。理性地说,我认为我需要使用Express中的一个方法,以便让它知道它正在侦听的主机名。我可以使用常量,但我需要在某个文件中正确写入主机,这允许用户出错。我相信它可以通过req访问,但我不想通过一百万个函数调用来传递它。@jasonmcarrell-那么,现在您要问的是,在发出http请求时为什么需要主机名?认真地如果您想围绕某个发出http请求的函数(默认为特定主机)创建自己的包装器,您当然可以这样做,但它没有内置到node.js http库中。通常,您不需要对自己的代码发出实际的HTTP请求。只需在函数中公开所需的功能并进行直接函数调用。通常没有理由通过HTTP来调用自己的代码。调用代理url?你想不出一个原因吗?似乎在同构库中要求高标准和一致性的要求在今天太高了。我要结束这个,因为它显然没有效率。仅供参考,我只是用了一个常数。客户端并不介意完全限定的URL,即使它不需要它们。编辑:nm不会关闭它,其他人可能会遇到这个问题,并且它已经有了答案。存在并不会损害任何东西。@jasonmcarrell-问题是
HTTP
库或node.js应用程序没有基本URL或主机名。它只是一个实用程序库,一个node.js文件甚至可以包含多个主机名的多个服务器。此外,即使是服务器也不一定知道自己的主机名。它只是侦听进入此服务器的请求,无论它们如何到达此IP。您可以为
http
创建自己的包装器对象,并在其上设置默认主机名,您可以包装每个采用主机名的方法,如果尚未存在默认主机名,则添加默认主机名。