【发布时间】:2019-10-26 20:24:49
【问题描述】:
我有一个托管在 DigitalOcean 液滴上的反应网站。我还有一个 node.js 服务器在同一个 droplet 上运行。从后端获取时,我应该用什么 url 替换?
从我的计算机本地运行我的前端和后端时,该网站正确获取数据。在本地工作时,我在获取数据时使用了 url http://localhost:3000/users。我尝试了很多不同的 url,但在服务器上尝试时它们都不起作用。这只是一个例子,我的网站中还有其他部分可以从中获取,但我想先让这部分工作。我的例子不受他们的影响。
async componentDidMount() {
// for usernames
const response = await fetch('http://localhost:3000/users');
const data = await response.json();
this.setState({ users: data });
}
我做了https://www.mywebsite.com:3000/users,这给了我控制台上的错误:
跨域请求被阻止:同源策略不允许 在https://www.mywebsite.com/users 读取远程资源。 (原因:CORS 请求未成功)。
和
TypeError:尝试获取资源时出现 NetworkError。
在火狐上。我尝试了许多变体,例如更改为 http、删除 www、仅放置 /users、删除 :3000 等等,但它们都不起作用。 如果我在终端上 curl mywebsite.com:3000/users,我会得到我想要的数据。如果我在浏览器上键入它也可以。用 IP 地址替换域也可以。所以,我确实 fetch(mywebsite.com:3000/users) 和其余代码。这不起作用,因为 fetch 希望我以 http 或 https 开头。
编辑:我忘了说我在 node.js 服务器上使用 express.js
编辑:我也通过 nginx 运行网站。我使用这种方法:https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-18-04 来运行我的后端。
编辑:我发现后端在 nginx 上运行,链接为 http://mywebsite.com:3000/users。再次通过浏览器或终端输入数据时,我得到了数据。但我的第一个错误改为:
阻止加载混合活动内容“http://mywebsite.com:3000/users” www.fakeconomy.com:1:882
该链接重定向到 mywebsite.com:3000/users 并显示数据。所以我认为这与只输入 mywebsite.com:3000/users 没有什么不同。将其更改为 https 或添加 www。不起作用。
【问题讨论】:
-
似乎 cors 在服务器上已禁用。如果您使用的是 expressJs,请转到 enable-cors.org/server_expressjs.html 如果有任何其他服务器框架让我知道
-
@ArshpreetWadehra 我按照链接复制并粘贴了 app.use() 代码并添加了“next”参数,因为我之前只有 (req, res)。我仍然得到同样的错误。我需要更换任何东西吗?
-
您发出 GET 请求。是否可以通过浏览器直接访问mywebsite.com:3000/users 来获取require 输出?
-
@ArshpreetWadehra 是的。我在我的问题中也是这么说的。它仍然有效。我尝试将 fetch url 改回你所说的,它只是给出了第二个错误。但我认为在我添加新代码之前是一样的。
-
尝试使用cors插件github.com/expressjs/cors
标签: javascript node.js reactjs