javascript - 尝试使用 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触发下载,但我不需要下载,我只需要将数据临时存储在变量中。
请提供任何帮助或建议。
解决方案
我也尝试添加 [
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;",
},
});
预先警告,你真的,真的需要信任这个服务才能在任何项目中使用它。通过他们的服务路由您的请求,您隐含地允许他们不受限制地窥探您的流量,并可能将恶意内容返回给您的客户。在您控制的自己的服务器上执行此操作是一个更好的主意。
推荐阅读
- r - R 在有条件的情况下滞后日期
- php - 如何在 PHP 中设置带有安全标志的 cookie?
- outlook - Microsoft Office Professional Plus 2019 - Outlook - notificationMessages.replaceAsync 不工作
- python - 为什么我不能在 PYTHON 类中使用全局变量?
- html - btn 点击时的图像缩放
- javascript - Web 蓝牙 API 错误:没有匹配 UUID 的服务
- python - Pandas pivot_table:无法实现正确的格式
- docker - 当我尝试从 docker 文件运行命令以查找和删除特定日志时,为什么会显示“找不到文件”?
- javascript - 特定文档 ID 上的事件侦听器,而不是整个数据库
- javascript - 查看java脚本包注释