Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

URL Blocked by CORS policy

Mesmo seguindo os passos do vídeo, estou tendo problema de CORS ao deletar uma foto. Qual a solução para isso?

Segue o console:

localhost/:1 Access to XMLHttpRequest at 'http://localhost:3000/v1/SaN4URkxvt5ewWeT' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Home.vue?4de6:70 Response {url: "http://localhost:3000/v1/SaN4URkxvt5ewWeT", ok: false, status: 0, statusText: "", headers: Headers, …}
main.js?attr=IpDViMYsrVbPZk8d5rbIEc57M7TSTr369i8f1uPSG3yKGRkK0sJONA6CitzviPug:1063 DELETE http://localhost:3000/v1/SaN4URkxvt5ewWeT net::ERR_FAILED
window.XMLHttpRequest.send @ main.js?attr=IpDViMYsrVbPZk8d5rbIEc57M7TSTr369i8f1uPSG3yKGRkK0sJONA6CitzviPug:1063
eval @ vue-resource.esm.js?f3ef:1082
PromiseObj @ vue-resource.esm.js?f3ef:196
xhrClient @ vue-resource.esm.js?f3ef:1019
sendRequest @ vue-resource.esm.js?f3ef:1180
Client @ vue-resource.esm.js?f3ef:1143
Http @ vue-resource.esm.js?f3ef:1385
Http.<computed> @ vue-resource.esm.js?f3ef:1416
remove @ Home.vue?4de6:68
botaoAtivado @ Home.vue?bcda:69
invokeWithErrorHandling @ vue.esm.js?efeb:1863
invoker @ vue.esm.js?efeb:2188
invokeWithErrorHandling @ vue.esm.js?efeb:1863
Vue.$emit @ vue.esm.js?efeb:3897
disparaAcao @ Botao.vue?ebfb:27
click @ Botao.vue?c204:13
invokeWithErrorHandling @ vue.esm.js?efeb:1863
invoker @ vue.esm.js?efeb:2188
original._wrapper @ vue.esm.js?efeb:7565

Segue o código:

<template>
  <div>
    <h1 class="centralizado">{{ titulo }}</h1>

    <p v-show="mensagem" class="centralizado">{{ mensagem }}</p>
    <input
      type="search"
      class="filtro"
      @input="filtro = $event.target.value"
      placeholder="filtre por parte do título"
    />

    <ul class="lista-fotos">
      <li class="lista-fotos-item" v-for="foto in fotosComFiltro" :key="foto.url">
        <meu-painel :titulo="foto.titulo">
          <imagem-responsiva
            v-meu-transform:scale.animate="1.2"
            :url="foto.url"
            :titulo="foto.titulo"
          />
          <meu-botao
            tipo="button"
            rotulo="REMOVER"
            @botaoAtivado="remove(foto)"
            :confirmacao="false"
            estilo="perigo"
          />
        </meu-painel>
      </li>
    </ul>
  </div>
</template>

<script>
import Painel from '../shared/painel/Painel.vue';
import ImagemResponsiva from '../shared/imagem-responsiva/ImagemResponsiva.vue';
import Botao from '../shared/botao/Botao.vue';

export default {
  components: {
    'meu-painel': Painel,
    'imagem-responsiva': ImagemResponsiva,
    'meu-botao': Botao
  },

  data() {
    return {
      titulo: 'Alurapic',
      fotos: [],
      filtro: '',
      mensagem: ''
    };
  },

  computed: {
    fotosComFiltro() {
      if (this.filtro) {
        let exp = new RegExp(this.filtro.trim(), 'i');
        return this.fotos.filter(foto => exp.test(foto.titulo));
      } else {
        return this.fotos;
      }
    }
  },

  methods: {
    remove(foto) {
      this.$http.delete(`http://localhost:3000/v1/${foto._id}`)
      .then(() => this.mensagem = `Foto "${foto.titulo}" removida com sucesso`, err => {
        console.log(err);
        this.mensagem = 'Não foi possível remover a foto';
      });
    }
  },

  created() {
    this.$http
      .get('http://localhost:3000/v1/fotos')
      .then(res => res.json())
      .then(fotos => (this.fotos = fotos), err => console.log(err));
  }
};
</script>

<style>
.centralizado {
  text-align: center;
}

.lista-fotos {
  list-style: none;
}

.lista-fotos .lista-fotos-item {
  display: inline-block;
}

.filtro {
  display: block;
  width: 100%;
}
</style>
4 respostas

Oi, Stanislaw, tudo bem?

Esse aluno teve o mesmo problema, segue a solução: https://cursos.alura.com.br/forum/topico-request-bloqueado-pelo-cors-78951

Me fala se obteve sucesso :}

Oi Laís!

Funcionou em parte, agora a API fornecida pelo Alura, https://cursos.alura.com.br/course/vue-parte1/task/23212, está retornando o status 404 (not found).

Segue o log de erro:

main.js?attr=LeNbi19MO3lijyUwHk5rz4rDmoT6lScS7kWLAcec7Lmc5UTRde-EP8rgnvnwtdir:1063 DELETE http://localhost:3000/v1/SaN4URkxvt5ewWeT 404 (Not Found)
window.XMLHttpRequest.send @ main.js?attr=LeNbi19MO3lijyUwHk5rz4rDmoT6lScS7kWLAcec7Lmc5UTRde-EP8rgnvnwtdir:1063
eval @ vue-resource.esm.js?f3ef:1082
PromiseObj @ vue-resource.esm.js?f3ef:196
xhrClient @ vue-resource.esm.js?f3ef:1019
sendRequest @ vue-resource.esm.js?f3ef:1180
Client @ vue-resource.esm.js?f3ef:1143
Http @ vue-resource.esm.js?f3ef:1385
Http.<computed> @ vue-resource.esm.js?f3ef:1416
remove @ Home.vue?4de6:68
botaoAtivado @ Home.vue?bcda:69
invokeWithErrorHandling @ vue.esm.js?efeb:1863
invoker @ vue.esm.js?efeb:2188
invokeWithErrorHandling @ vue.esm.js?efeb:1863
Vue.$emit @ vue.esm.js?efeb:3897
disparaAcao @ Botao.vue?ebfb:27
click @ Botao.vue?c204:13
invokeWithErrorHandling @ vue.esm.js?efeb:1863
invoker @ vue.esm.js?efeb:2188
original._wrapper @ vue.esm.js?efeb:7565
Home.vue?4de6:74 Response {url: "http://localhost:3000/v1/SaN4URkxvt5ewWeT", ok: false, status: 404, statusText: "Not Found", headers: Headers, …}body: "Cannot DELETE /v1/SaN4URkxvt5ewWeT↵"bodyText: "Cannot DELETE /v1/SaN4URkxvt5ewWeT↵"headers: Headers {map: {…}}ok: falsestatus: 404statusText: "Not Found"url: "http://localhost:3000/v1/SaN4URkxvt5ewWeT"data: (...)__proto__: Object

Na API fornecida pelo Alura eu adicionei a biblioteca cors, npm install cors --save, coloquei a chamada no arquivo config/express.js conforme abaixo:

var express = require('express')
    ,app = express()
    ,bodyParser = require('body-parser')
    ,routes = require('../app/routes')
    ,cors = require('cors');

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(cors());

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
  next();
});


routes(app);

module.exports = app;
solução!

Oi, Stanislaw, tudo bem?

Erre erro está no retornando uma url estranha: http://localhost:3000/v1/SaN4URkxvt5ewWeT. O seu projeto está no github? Gostaria de testar ele.

No seu template para remoção de fotos etá faltando o campo fotosno caminho da url this.$http.delete(http://localhost:3000/v1/fotos/${foto._id}) E retira o campo:key="foto.url `

Até esse momento da aula, quando se clica em remover foto, a api no retorna uma mensagem de sucesso, mas a imagem não é removida de fato, na aula seguinte, o professor irá adicionar um array que irá remover totalmente a foto quando foi clicado pedindo a remoção.

Porém eu testei com o projeto do curso e não obtive essa url quando lenvantei a api. Então, seria importante testar com o seu código para estudar e testar. Aguardo :}

Na aula seguinte o professor utilizou resources na conexão com a API e o erro sumiu, então posso dar deixar como solução.

Obrigado pela atenção.