Lỗi AngularJS: Yêu cầu nguồn gốc chéo chỉ được hỗ trợ cho các sơ đồ giao thức: http, dữ liệu, tiện ích mở rộng chrome, https


130

Tôi có ba tập tin của một ứng dụng js góc rất đơn giản

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>

sản phẩm-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"
              }
  ];

})();

Tôi đã bắt đầu gặp lỗi này ngay sau khi tôi nhập bao gồm sản phẩm-color.html bằng cách sử dụng chỉ thị tùy chỉnh có tên là sản phẩmColor:

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'.

Điều gì có thể đi sai? Đây có phải là sự cố đường dẫn cho sản phẩm-color.html không?

Tất cả ba tệp của tôi nằm trong cùng một thư mục gốc C:/user/project/


1
Chỉ cần một con trỏ nhanh là nếu bạn làm điều gì đó ngu ngốc, chẳng hạn như trong trường hợp của tôi, tôi đã vô tình gắn TLD vào cổng: " localhost: 8070.com " thì bạn sẽ nhận được lỗi tương tự. Kiểm tra URL nào bạn đang cố gắng giải quyết!
Wildhoney


Câu trả lời:


306

Lỗi này xảy ra vì bạn chỉ đang mở tài liệu html trực tiếp từ trình duyệt. Để khắc phục điều này, bạn sẽ cần cung cấp mã của mình từ máy chủ web và truy cập nó trên localhost. Nếu bạn có thiết lập Apache, hãy sử dụng nó để phục vụ các tệp của bạn. Một số IDE đã được xây dựng trong các máy chủ web, như IDE của JetBrains, Eclipse ...

Nếu bạn có thiết lập Node.Js thì bạn có thể sử dụng máy chủ http . Chỉ cần chạy npm install http-server -gvà bạn sẽ có thể sử dụng nó trong thiết bị đầu cuối như thế nào http-server C:\location\to\app.


6
Giải pháp tuyệt vời!
Jorge

3
Máy chủ http là cách đơn giản nhất tôi từng thấy về việc lưu trữ cục bộ. Lưu ý: Nếu bạn không có npm trên windows, chỉ cần cài đặt node.js và nó sẽ có sẵn trong cmd.
Octane

3
Và nếu nó xảy ra trong webview trong Android, tôi nên làm gì!?
Dr.jacky

2
Vì tò mò, tại sao không thể mở các tệp trong trình duyệt web?
tobiak777

3
@reddy Đơn giản và đơn giản: Đây là vấn đề bảo mật để trình duyệt truy cập trực tiếp vào hệ thống tệp trên máy tính của bạn.
Alex J

49

RẤT ĐƠN GIẢN

  1. Chuyển đến thư mục ứng dụng của bạn
  2. Bắt đầu máy chủ SimpleHTTPS


Trong nhà ga

$ cd yourAngularApp
~/yourAngularApp $ python -m SimpleHTTPServer

Bây giờ, hãy truy cập localhost: 8000 trong trình duyệt của bạn và trang sẽ hiển thị


8
Trong Python 3, nó phải như vậy python -m http.server.
Luan Nico

1
Điều này đã giúp rất nhiều! Giải pháp tuyệt vời.
mirta

42

Các hoạt động không được phép trong chrome. Bạn có thể sử dụng máy chủ HTTP (Tomcat) hoặc thay vào đó bạn sử dụng Firefox.


4
Tôi đã sử dụng firefox thay vào đó trong tình huống của tôi và nó hoạt động. Chrome có bảo mật hơn Firefox không? Tại sao tôi được phép làm điều này ....
thatOneGuy

Đó là câu trả lời tốt nhất cho tôi.
Thomas

1
Ngắn gọn và đơn giản ... Đã làm việc!
viks

thực sự đã giúp tôi
Ram Dutt Shukla

1
Hey..cảm ơn rất nhiều .. câu trả lời của bạn là một sự trợ giúp lớn ... đã tiết kiệm rất nhiều thời gian của tôi
Megha

31

Vấn đề của tôi đã được giải quyết chỉ bằng cách thêm http://vào địa chỉ url của tôi. ví dụ tôi sử dụng http://localhost:3000/moviesthay vì localhost:3000/movies.


13

Nếu bạn đang sử dụng điều này trong trình duyệt chrome / chromium (ví dụ: trong Ubuntu 14.04), bạn có thể sử dụng một trong các lệnh dưới đây để giải quyết vấn đề này.

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

Điều này sẽ cho phép bạn tải tệp bằng chrome hoặc crom. Nếu bạn phải thực hiện thao tác tương tự cho các cửa sổ, bạn có thể thêm công tắc này trong các thuộc tính của phím tắt chrome hoặc chạy nó từ cmdcờ. Thao tác này không được phép trong Chrome, Opera, Internet Explorer theo mặc định. Theo mặc định, nó chỉ hoạt động trong firefox và safari. Do đó sử dụng lệnh này sẽ giúp bạn.

Thay phiên, bạn cũng có thể lưu trữ nó trên bất kỳ máy chủ web nào (Ví dụ: Tomcat-java, NodeJS-JS, Tornado-Python, v.v.) dựa trên ngôn ngữ mà bạn cảm thấy thoải mái. Điều này sẽ làm việc từ bất kỳ trình duyệt.


12

Nếu vì bất kỳ lý do gì, bạn không thể có các tệp được lưu trữ từ máy chủ web và vẫn cần một số cách tải các phần, bạn có thể sử dụng lệnh ngTemplatenày.

Bằng cách này, bạn có thể bao gồm đánh dấu của mình bên trong các thẻ script trong tệp index.html của bạn và không phải bao gồm đánh dấu như một phần của chỉ thị thực tế.

Thêm phần này vào index.html của bạn

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

Sau đó, trong chỉ thị của bạn:

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

Vì tôi đã chỉnh sửa bài đăng này, hãy sử dụng templateUrl: 'tpl-productColor'
HANU

5

Nguyên nhân gốc:

Giao thức tệp không hỗ trợ yêu cầu nguồn gốc chéo cho Chrome

Giải pháp 1:

sử dụng giao thức http thay vì tệp, nghĩa là: thiết lập máy chủ http, chẳng hạn như apache hoặc nodejs + http-server

Lưu ý 2:

Thêm --allow-file-access-from-files sau mục tiêu phím tắt của Chrome và mở phiên bản duyệt mới bằng phím tắt này

nhập mô tả hình ảnh ở đây

Giải pháp 3:

sử dụng Firefox thay thế


Sử dụng Firefox đã giúp tôi
Vineeth Subbaraya

5
  1. Cài đặt máy chủ http, chạy lệnh npm install http-server -g
  2. Mở terminal trong đường dẫn được đặt index.html
  3. Chạy lệnh http-server . -o
  4. Hãy tận hưởng nó!

4

Tôi sẽ thêm rằng người ta cũng có thể sử dụng xampp, loại mamp của những thứ và đặt dự án của bạn vào thư mục htdocs để nó có thể truy cập được trên localhost


2

Nếu bạn đang chạy máy chủ, đừng quên sử dụng http: // trong lệnh gọi API. Điều này có thể gây ra một rắc rối nghiêm trọng.


Cảm ơn người đàn ông, hai giờ tìm kiếm giải pháp cho cùng một vấn đề và đây là ...
Santi Nunez

Chào mừng bạn Mã hóa hạnh phúc :)
Edison D'souza

1

Nguyên nhân

Bạn không mở trang thông qua một máy chủ, như Apache, vì vậy khi trình duyệt cố lấy tài nguyên, nó nghĩ rằng nó đến từ một miền riêng biệt, điều này không được phép. Mặc dù một số trình duyệt cho phép nó.

Giải pháp

Chạy inetmgr và lưu trữ trang của bạn cục bộ và duyệt dưới dạng http: // localhost: portnumber / PageName.html hoặc thông qua một máy chủ web như Apache, nginx, nút, v.v.

Hoặc sử dụng một trình duyệt khác Không có lỗi nào được hiển thị khi trực tiếp mở trang bằng Firefox và Safari. Nó chỉ dành cho Chrome và IE (xx).

Nếu bạn đang sử dụng các trình soạn thảo mã như Brackets, Sublime hoặc Notepad ++, các ứng dụng đó sẽ tự động xử lý lỗi này.


1

Vấn đề này không xảy ra trong Firefox và Safari. Đảm bảo bạn đang sử dụng phiên bản mới nhất của xml2json.js. Bởi vì tôi phải đối mặt với lỗi trình phân tích cú pháp XML trong IE. Trong Chrome cách tốt nhất bạn nên mở nó trong máy chủ như Apache hoặc XAMPP.


1

Có tiện ích chrome 200ok, máy chủ web dành cho chrome chỉ cần thêm và chọn thư mục của bạn


Giải pháp tuyệt vời
Mohamed Adel

0

Bạn phải mở chrome bằng cờ sau Đi đến menu chạy và gõ "chrome --disable-web-security --user-data-dir"

Đảm bảo tất cả các phiên bản của chrome được đóng trước khi bạn sử dụng cờ để mở chrome. Bạn sẽ nhận được cảnh báo bảo mật cho biết CORS được bật.


0

Thêm vào @Kirill Fuchs giải pháp tuyệt vời và trả lời nghi ngờ của @ StackUser - trong khi khởi động máy chủ http, chỉ đặt đường dẫn đến thư mục ứng dụng, KHÔNG cho đến trang html! http-server C:\location\to\appvà truy cập index.htmltrong appthư mục


0

Điều hướng đến C: /user/project/index.html, mở nó bằng Visual Studio 2017, File> View trong Trình duyệt hoặc nhấn Ctrl + Shift + W


-1

Tôi gặp vấn đề tương tự. Sau khi thêm mã dưới đây vào tệp app.js của tôi, nó đã được sửa.

var cors = require('cors')
app.use(cors());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.