【问题标题】:Why must I include the host with URLs with node web requests?为什么我必须在节点 Web 请求中包含带有 URL 的主机?
【发布时间】:2017-02-16 16:47:25
【问题描述】:

无论我为 node 使用哪个库,它们都需要绝对 URL。

这意味着我需要构建一个 fetch curry,然后通过函数链传递该 fetch 以便能够发出请求,或者我需要在确定我是在生产还是开发之后定义一个常量,然后每当我的环境发生变化时更新该 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 请求时,没有相对于您可以发出请求的“基本 HREF”之类的东西,因此需要绝对 URL。
  • 所以 express.listen 没有为其他库设置任何全局变量来查找相对于主机 url。这回答了我的第一个问题。它没有回答我的第二个问题“有没有更无缝的方式在我的应用程序的任何地方进行服务器端请求?”
  • 您的示例代码会创建一个无限循环。
  • 我不明白你的意思。怎么样?

标签: node.js express isomorphic-fetch-api


【解决方案1】:

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

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

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

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

【讨论】:

  • “相对”一词用错了。我在标题中修复了它,但忘记在正文中修复它。我不喜欢必须指定主机名。我添加了一个代码示例。理性地说,我想我需要使用 Express 中的一种方法来让它知道它正在侦听的主机名。我可以使用常量,但是我需要在某个文件中正确地写入我的主机,这会导致用户出错。我相信它可以通过 req 访问,但我不想通过一百万个函数调用来传递它。
  • @JasonMcCarrell - 现在你问为什么在发出 http 请求时需要主机名?严重地?如果您想围绕某个发出 http 请求的函数创建自己的包装器,该函数默认为特定主机,您当然可以这样做,但它没有内置到 node.js http 库中。而且,通常,您不需要对自己的代码发出实际的 HTTP 请求。只需在函数中公开您想要的功能并进行直接函数调用。通常没有理由通过 HTTP 调用您自己的代码。
  • 调用代理网址?你想不出一个原因?
  • 今天似乎有很高的标准并且想要同构库的一致性是太多了。我将关闭它,因为它显然没有生产力。仅供参考,我只是使用了一个常数。客户端不介意完全限定的 URL,即使它不需要它们。编辑: nm 不会关闭它,其他人可能会遇到这个并且它已经有了答案。存在并没有伤害任何东西。
  • @JasonMcCarrell - 问题是HTTP 库或 node.js 应用程序没有基本 URL 或主机名。它只是一个实用程序库,单个 node.js 文件甚至可以包含多个主机名的多个服务器。另外,即使是服务器也不一定知道自己的主机名。它只是侦听传入此服务器的请求,无论它们如何到达此 IP。您可以为 http 创建自己的包装器对象,并在其上设置默认主机名,然后您可以包装每个采用主机名的方法并添加默认主机名(如果尚不存在)。
猜你喜欢
  • 2019-03-15
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2011-01-28
相关资源
最近更新 更多