首页 > 解决方案 > 尝试使用 javascript 在 excel 插件中从 nrel 网站获取文件数据的问题

问题描述

我正在尝试从nrel 开发者网站的 url 获取 csv 数据。不幸的是,我无法使用 json 数据,因为它会将其发送到电子邮件,而 csv 文件是即时的。我可以使用以下方法使用 vba 来实现这一点:

With req
    .Open "GET", parsedUrl, False
    .SetRequestHeader "Content-Type", "text/csv;"
    .Send
End With

result = Split(req.responseText, Chr(10))
'do work with result

但是,使用 javascript 和 excel 插件文档时,我无法将 csv 数据存储在变量中。我尝试了以下代码

const res = await fetch(tmyUrl, {
    method: "GET",
    headers: {
      "Content-Type": "text/csv;",
    },
  });
  if (!res.ok) throw new Error("There was a problem trying to get the the weather data.");

但这给了我以下错误: 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我还尝试添加以下内容:

mode: "no-cors"

但是 res.ok 是假的,身体似乎是空的。处理这个请求需要一点时间,所以我知道它正在后台做一些事情。我也可以使用downloadjs触发下载,但我不需要下载,我只需要将数据临时存储在变量中。

请提供任何帮助或建议。

标签: javascriptcsvfetchexcel-addins

解决方案


我也尝试添加 [ mode: "no-cors"] 但是......身体似乎是空的。

这正是因为您使用mode: no-cors. 此行为有据可查,并在此 SO 线程中详细讨论。从链接的 MDN 页面(强调我的):

no-cors— 防止方法是 HEAD、GET 或 POST 以外的任何内容,并且标头不能是简单标头以外的任何内容。如果任何 ServiceWorkers 拦截了这些请求,它们可能不会添加或覆盖除简单标头之外的任何标头。此外,JavaScript 可能不会访问结果 Response 的任何属性。这可确保 ServiceWorker 不会影响 Web 的语义,并防止因跨域泄漏数据而引起的安全和隐私问题。


您首先看到 CORS 错误的原因是响应您的请求的服务器已故意以这种方式配置,以防止对其资源的这些类型的请求。您可以通过向您自己的服务器(允许 CORS)发出请求来绕过此问题,然后服务器可以将最终请求代理到服务并将响应返回给您的客户端。曾经有几个突出的插入式服务提供了此功能,但由于服务滥用(CORS Anywhere 和 What Origin,仅举两个例子),大多数都被搁置了。

仍然存在一种服务似乎仍然代理这些类型的请求 - All Origins。根据他们的文档放入您的 URL 以有效绕过此限制:

const res = await fetch(`https://allorigins.win/get?url=${encodeURIComponent(tmyUrl)}`, {
    method: "GET",
    headers: {
      "Content-Type": "text/csv;",
    },
});

预先警告,你真的,真的需要信任这个服务才能在任何项目中使用它。通过他们的服务路由您的请求,您隐含地允许他们不受限制地窥探您的流量,并可能将恶意内容返回给您的客户。在您控制的自己的服务器上执行此操作是一个更好的主意。


推荐阅读