Erro AngularJS: solicitações de origem cruzada são suportadas apenas para esquemas de protocolo: http, dados, extensão de cromo, https


130

Eu tenho três arquivos de um aplicativo js angular muito simples

index.html

<!DOCTYPE html>
<html ng-app="gemStore">
  <head>
    <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js'></script>
    <script type="text/javascript" src="app.js"></script>
  </head>

  <body ng-controller="StoreController as store">
      <div class="list-group-item" ng-repeat="product in store.products">
        <h3>{{product.name}} <em class="pull-right">{{product.price | currency}}</em></h3>
      </div>

  <product-color></product-color>
  </body>
</html>

product-color.html

<div class="list-group-item">
    <h3>Hello <em class="pull-right">Brother</em></h3>
</div>

app.js

(function() {
  var app = angular.module('gemStore', []);

  app.controller('StoreController', function($http){
              this.products = gem;
          }
  );

  app.directive('productColor', function() {
      return {
          restrict: 'E', //Element Directive
          templateUrl: 'product-color.html'
      };
   }
  );

  var gem = [
              {
                  name: "Shirt",
                  price: 23.11,
                  color: "Blue"
              },
              {
                  name: "Jeans",
                  price: 5.09,
                  color: "Red"
              }
  ];

})();

Comecei a receber esse erro assim que inseri uma inclusão de product-color.html usando a diretiva personalizada denominada productColor:

XMLHttpRequest cannot load file:///C:/product-color.html. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource.
angular.js:11594 Error: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'file:///C:/product-color.html'.

O que pode estar errado? É um problema de caminho para product-color.html?

Todos os meus três arquivos estão na mesma pasta raiz C:/user/project/


1
Apenas um apontador rápido de que se você fizer algo estúpido, como no meu caso, acidentalmente anexei o TLD à porta: " localhost: 8070.com ", você receberá o mesmo erro. Verifique qual URL você está tentando resolver!
Wildhoney


Respostas:


306

Este erro está ocorrendo porque você está apenas abrindo documentos html diretamente do navegador. Para corrigir isso, você precisará fornecer seu código em um servidor da web e acessá-lo no host local. Se você tiver a configuração do Apache, use-o para servir seus arquivos. Alguns IDE's construíram servidores Web, como o JetBrains IDE, o Eclipse ...

Se você tiver a configuração do Node.Js, poderá usar o servidor http . Basta executar npm install http-server -ge você será capaz de usá-lo no terminal como http-server C:\location\to\app.


6
Excelente solução!
1074 Jorge Jorge

3
O servidor http é a maneira mais simples de hospedagem local. Nota: Se você não possui o npm no Windows, basta instalar o node.js e ele ficará disponível no cmd.
Octane

3
E se isso aconteceu no webview no android, o que devo fazer !?
Dr.jacky

2
Por curiosidade, por que não é possível simplesmente abrir os arquivos no navegador da web?
precisa saber é o seguinte

3
Simplesmente simples: é uma questão de segurança para o navegador acessar o sistema de arquivos diretamente no seu computador.
Alex J

49

CORREÇÃO MUITO SIMPLES

  1. Vá para o diretório do seu aplicativo
  2. Iniciar o SimpleHTTPServer


No terminal

$ cd yourAngularApp
~/yourAngularApp $ python -m SimpleHTTPServer

Agora, vá para localhost: 8000 no seu navegador e a página será exibida


8
No Python 3, deveria ser python -m http.server.
Luan Nico

1
Isso ajudou muito! Ótima solução.
Mirta

42

A operação não é permitida no chrome. Você pode usar um servidor HTTP (Tomcat) ou o Firefox.


4
Eu usei o Firefox na minha situação e funciona. O Chrome tem mais segurança que o Firefox? Por que estou autorizado a fazer isso ....
thatOneGuy

Essa é a melhor resposta para mim.
Thomas

1
Curto e Simples ... Trabalhou!
Viks

realmente me ajudou também.
Ram Dutt Shukla

1
Hey..thanks muito .. sua resposta foi uma grande ajuda ... salvou muito do meu tempo
Megha

31

Meu problema foi resolvido apenas adicionando http://ao meu endereço de URL. por exemplo, usei em http://localhost:3000/moviesvez de localhost:3000/movies.


13

Se você estiver usando isso no navegador chrome / chromium (por exemplo, no Ubuntu 14.04), poderá usar um dos comandos abaixo para solucionar esse problema.

ThinkPad-T430:~$ google-chrome --allow-file-access-from-files
ThinkPad-T430:~$ google-chrome --allow-file-access-from-files fileName.html

ThinkPad-T430:~$ chromium-browser --allow-file-access-from-files
ThinkPad-T430:~$ chromium-browser --allow-file-access-from-files fileName.html

Isso permitirá que você carregue o arquivo em chrome ou crómio. Se você precisar fazer a mesma operação no Windows, poderá adicionar essa opção nas propriedades do atalho do chrome ou executá-la cmdcom o sinalizador. Esta operação não é permitida no Chrome, Opera, Internet Explorer por padrão. Por padrão, ele funciona apenas no Firefox e Safari. Portanto, usar este comando irá ajudá-lo.

Como alternativa, você também pode hospedá-lo em qualquer servidor da web (exemplo: Tomcat-java, NodeJS-JS, Tornado-Python etc.) com base em qual idioma você se sente confortável. Isso funcionará em qualquer navegador.


12

Se, por qualquer motivo, você não puder hospedar os arquivos em um servidor da web e ainda precisar de algum tipo de carregamento de parciais, use a ngTemplatediretiva.

Dessa forma, você pode incluir sua marcação nas tags de script no arquivo index.html e não precisar incluir a marcação como parte da diretiva real.

Adicione isso ao seu index.html

<script type='text/ng-template' id='tpl-productColour'>
 <div class="list-group-item">
    <h3>Hello <em class="pull-right">Brother</em></h3>
</div>
</script>

Então, na sua diretiva:

app.directive('productColor', function() {
      return {
          restrict: 'E', //Element Directive
          //template: 'tpl-productColour'
          templateUrl: 'tpl-productColour'
      };
   }
  );

Como já editei este post, use templateUrl: 'tpl-productColor'
HANU

5

Causa raiz:

O protocolo de arquivo não suporta solicitação de origem cruzada para o Chrome

Solução 1:

use o protocolo http em vez de arquivo, o que significa: configurar um servidor http, como apache ou nodejs + http-server

Procedimento 2:

Adicione - Permitir acesso a arquivos após o destino do atalho do Chrome e abra uma nova instância de navegação usando este atalho

insira a descrição da imagem aqui

Solução 3:

use o Firefox


Usando o Firefox me ajudou
Vineeth Subbaraya

5
  1. Instale o servidor http, executando o comando npm install http-server -g
  2. Abra o terminal no caminho onde está localizado o index.html
  3. Comando de execução http-server . -o
  4. Aproveite!

4

Eu acrescentaria que também é possível usar xampp, tipo mamp, e colocar seu projeto na pasta htdocs para que ele seja acessível no localhost


2

Se você já estiver executando o servidor, não se esqueça de usar http: // na chamada da API. Isso pode causar um problema sério.


Graças homem, duas horas à procura de solução para mesmo problema e foi isso ...
Santi Nunez

Bem-vindo mano. Feliz codificação :)
Edison D'souza

1

O motivo

Você não está abrindo a página através de um servidor, como o Apache, portanto, quando o navegador tenta obter o recurso, ele pensa que é de um domínio separado, o que não é permitido. Embora alguns navegadores permitam.

A solução

Execute o inetmgr e hospede sua página localmente e navegue como http: // localhost: portnumber / PageName.html ou através de um servidor Web como Apache, nginx, node etc.

Como alternativa, use um navegador diferente Nenhum erro foi mostrado ao abrir diretamente a página usando o Firefox e o Safari. Ele vem apenas para Chrome e IE (xx).

Se você estiver usando editores de código como Brackets, Sublime ou Notepad ++, esses aplicativos lidam com esse erro automaticamente.


1

Esse problema não está acontecendo no Firefox e Safari. Verifique se você está usando a versão mais recente do xml2json.js. Porque eu enfrentei o erro do analisador XML no IE. Na melhor maneira do Chrome, você deve abri-lo no servidor como Apache ou XAMPP.



0

Você deve abrir o chrome usando o seguinte sinalizador: Vá para o menu Executar e digite "chrome --disable-web-security --user-data-dir"

Verifique se todas as instâncias do chrome estão fechadas antes de usar o sinalizador para abrir o chrome. Você receberá um aviso de segurança que indica que o CORS está ativado.


0

Adicionando à excelente solução @Kirill Fuchs e respondendo à dúvida do @ StackUser - ao iniciar o servidor http, defina o caminho até a pasta do aplicativo, NÃO até a página html! http-server C:\location\to\appe acessar index.htmlna apppasta


0

Navegue para C: /user/project/index.html, abra-o com o Visual Studio 2017, Arquivo> Visualizar no navegador ou pressione Ctrl + Shift + W


-1

Eu tive o mesmo problema. depois de adicionar o código abaixo ao meu arquivo app.js, ele foi corrigido.

var cors = require('cors')
app.use(cors());
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.