关于vue组件:推出5.1 API CORS问题

Rails 5.1 API CORS problems

我有一个生成json的Rails 5.1.6 API。 我有一个单独的Vue.js客户端,旨在使用它。

该模型是实体。 GET请求可以很好地查看数据库中所有实体的索引。 但是,当我尝试发布新实体时,在控制台中出现以下错误:

Access to XMLHttpRequest at 'http://localhost:3000/entities' from origin > 'http://localhost:8080' has been blocked by CORS policy: Response to
preflight request doesn't pass access control check: No 'Access-Control-
Allow-Origin' header is present on the requested resource.

在rails应用程序中,我已经安装了rack-cors gem和initializers/cors.rb

1
2
3
4
5
6
7
8
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:3000'
    resource '*',
      headers: :any,
      methods: %i(get post put patch delete options head)
  end
end

在routes.rb中:

1
2
3
4
5
6
7
8
9
Rails.application.routes.draw do
  # For details on the DSL...
  post 'auth/login', to: 'authentication#authenticate'
  post 'signup', to: 'users#create'

  resources :entities do
    resources :transactions
  end
end

在客户端层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
src/services/Api.js:

import axios from 'axios'

export default() => {
  return axios.create({
    baseURL: 'http://localhost:3000'
  })
}



src/services/EntitiesService.js:

import Api from '@/services/Api'

export default {
  fetchEntities () {
    return Api().get('/entities')
  },

  addEntity (params) {
    return Api().post('entities', params)
  }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
src/components/newEntity.vue:

<template>
 
    Add Entity
     
       
          <input type="text" name="title" placeholder="TITLE" v-model="title">
       
       
          <textarea rows="15" cols="15" placeholder="DESCRIPTION" v-model="description"></textarea>
       
       
          <button class="app_entity_btn" @click="addEntity">Add</button>
       
     
 
</template>


import EntitiesService from '@/services/EntitiesService'
export default {
  name: 'NewEntity',
  data () {
    return {
      title: '',
      description: ''
    }
  },
  methods: {
    async addEntity () {
      await EntitiesService.addEntity({
        title: this.title,
        description: this.description
      })
      this.$router.push({ name: 'Entities' })
    }
  }
}

<style type="text/css">
.form input, .form textarea {
  width: 500px;
  padding: 10px;
  border: 1px solid #e0dede;
  outline: none;
  font-size: 12px;
}
.form div {
  margin: 20px;
}
.app_entity_btn {
  background: #4d7ef7;
  color: #fff;
  padding: 10px 80px;
  text-transform: uppercase;
  font-size: 12px;
  font-weight: bold;
  width: 520px;
  border: none;
  cursor: pointer;
}
</style>

这是怎么了


显然在请求中包含标头之后,此方法现在正在工作...

这是新的请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
src/services/Api.js

  import axios from 'axios'

    export default() => {
      return axios.create({
        baseURL: 'http://localhost:3000',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Access-Control-Allow-Origin': '*'
        }
      })
    }