我正在尝试在本地运行一个具有React / Redux前端并与rails api通信的应用程序。在我的EmailSchedule.History
中,我正在引用正在运行我的api的端口(.env file
使其在端口上运行rails s
3000)并且我的react dev服务器在API_URL
运行时被引用在localhost:3003。
当我转到localhost:3003并让我的反应字体结束时,我向我的api发送请求时出现以下错误:Bothy me HOST
文件也指向localhost上的正确端口。
XMLHttpRequest无法加载http://localhost:3000/users_company。没有 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://localhost:3003” 访问。响应的HTTP状态代码为500。
有什么想法吗?
答案 0 :(得分:4)
在使用create-react-app创建的react应用程序中,您可以在您的react应用程序的package.json中添加一个代理。以下是我自己的项目中的一个例子。
{
"name": "frontend",
"version": "0.1.0",
"private": true,
"proxy": "http://localhost:8000",
"dependencies": {
"@types/jest": "^19.2.3",
"@types/node": "^7.0.18",
"@types/react": "^15.0.24",
"@types/react-dom": "^15.5.0",
"@types/react-router-dom": "^4.0.4",
"@types/socket.io": "^1.4.29",
"@types/socket.io-client": "^1.4.29",
"axios": "^0.16.1",
"react": "^15.5.4",
"react-dom": "^15.5.4",
"react-router-dom": "^4.1.1",
"socket.io": "^2.0.1",
"socket.io-client": "^2.0.1"
},
"devDependencies": {
"react-scripts-ts": "1.4.0"
},
"scripts": {
"start": "react-scripts-ts start",
"build": "react-scripts-ts build",
"test": "react-scripts-ts test --env=jsdom",
"eject": "react-scripts-ts eject"
}
}
Webpack将接收请求并将它们代理到package.json中指定的url,并且将为您处理CORS。当然,这可以在手动创建的反应应用程序中完成,但这也意味着将webpack配置为手动代理请求。
我还应该指出,现在在您的代码中,您不需要像http://localhost:8000/api/something/some
那样编写整个网址,而只需编写api/something/some
即可。这对于部署当然非常有用,因为现在我们不关心url的第一部分,它显然从开发变为生产。
答案 1 :(得分:2)
如果您正在使用 webpack-dev-server ,那么对于正在使用Webpack但未使用创建React应用程序的任何人来说,您仍然可以设置代理。对于Webpack上的任何JavaScript前端都是如此,而不仅仅是React。
例如,我在localhost:8080上运行我的前端,而Rails在localhost:3000上运行。在您定义devServer
的部分的 webpack.config.js 文件中:
devServer: {
// ...
// Rails backend runs on localhost:3000
proxy: {
'/': {
target: 'http://localhost:3000',
secure: false
}
}
},
您可以在Webpack docs here和此处http-proxy-middleware docs(基础依赖项)中详细了解配置选项。
答案 2 :(得分:0)
是的,我怀疑这也是一个CORS的事情,评论只是因为它是特定的CORS + Rails,而不是在Node中解决。
有一个名为rack-cors的宝石可以让你将CORS'Access-Control-Allow-Origin
标题设置为渲染页面。
您将gem设置到Rails中间件链中,并允许来自*(最简单)或您可能看到请求的特定主机(更安全,但更烦人)。
有一篇很棒的博客文章:Navigating CORS using React and Rails。
你也可以考虑通过资产管道服务你的React应用程序(甚至可以通过git子模块,或者只是一个本地符号链接,如果你想让你的前端应用程序存在于你后端的一个单独的repo中(因为请这样做): react-rails-hot-loader