在本地运行React / Rails应用程序

时间:2017-07-05 17:34:03

标签: ruby-on-rails reactjs cors localhost

我正在尝试在本地运行一个具有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。

有什么想法吗?

3 个答案:

答案 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