ข้อผิดพลาด AngularJS: คำขอข้ามแหล่งที่มารองรับเฉพาะโครงร่างโปรโตคอล: http, data, chrome-extension, https


130

ฉันมีไฟล์สามไฟล์ของแอปพลิเคชั่น js เชิงมุมที่เรียบง่ายมาก

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>

ผลิตภัณฑ์ 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"
              }
  ];

})();

ฉันเริ่มได้รับข้อผิดพลาดนี้ทันทีที่ฉันป้อน include ของ product-color.html โดยใช้คำสั่งที่กำหนดเองชื่อ 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'.

อาจเกิดอะไรขึ้น? เป็นปัญหาเส้นทางสำหรับ product-color.html หรือไม่

ไฟล์ทั้งสามของฉันอยู่ในโฟลเดอร์รูทเดียวกัน C:/user/project/


1
เพียงแค่ชี้ให้เห็นว่าหากคุณทำอะไรโง่ ๆ เช่นในกรณีของฉันฉันบังเอิญต่อท้าย TLD เข้ากับพอร์ต: " localhost: 8070.com " คุณจะได้รับข้อผิดพลาดเดียวกัน ตรวจสอบ URL ที่คุณกำลังพยายามแก้ไข!
Wildhoney

อาจจะคล้าย ๆ กันที่นี่: stackoverflow.com/questions/10752055/…
NgôĐứcTuấn

คำตอบ:


306

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากคุณเพิ่งเปิดเอกสาร html โดยตรงจากเบราว์เซอร์ ในการแก้ไขปัญหานี้คุณจะต้องใช้รหัสของคุณจากเว็บเซิร์ฟเวอร์และเข้าถึงได้จาก localhost หากคุณมีการตั้งค่า Apache ให้ใช้เพื่อให้บริการไฟล์ของคุณ IDE บางตัวได้สร้างขึ้นในเว็บเซิร์ฟเวอร์เช่น JetBrains IDE's, Eclipse ...

หากคุณมีการติดตั้ง Node.js แล้วคุณสามารถใช้http เซิร์ฟเวอร์ เพียงแค่เรียกใช้npm install http-server -gและคุณจะสามารถใช้งานได้ใน terminal http-server C:\location\to\appเช่น


6
ทางออกที่ยอดเยี่ยม!
Jorge

3
http-server เป็นวิธีที่ง่ายที่สุดที่ฉันเคยเห็นในการโฮสต์ภายในเครื่อง หมายเหตุ: หากคุณไม่มี npm บน windows เพียงแค่ติดตั้ง node.js และจะพร้อมใช้งานใน cmd
ออกเทน

3
แล้วถ้าเกิดใน webview ใน android ควรทำอย่างไร!?
Dr.jacky

2
ด้วยความอยากรู้อยากเห็นทำไมถึงเปิดไฟล์ในเว็บเบราว์เซอร์ไม่ได้?
tobiak777

3
@reddy ธรรมดาและเรียบง่าย: เป็นปัญหาด้านความปลอดภัยสำหรับเบราว์เซอร์ในการเข้าถึงระบบไฟล์โดยตรงบนคอมพิวเตอร์ของคุณ
Alex J

49

แก้ไขง่ายมาก

  1. ไปที่ไดเรกทอรีแอปของคุณ
  2. เริ่ม SimpleHTTPServer


ในเทอร์มินัล

$ cd yourAngularApp
~/yourAngularApp $ python -m SimpleHTTPServer

ตอนนี้ไปที่ localhost: 8000 ในเบราว์เซอร์ของคุณและหน้าจะแสดงขึ้น


8
ใน Python 3 ควรเป็นpython -m http.server.
Luan Nico

1
สิ่งนี้ช่วยได้มาก! ทางออกที่ดี
mirta

42

ไม่อนุญาตให้ใช้งานใน Chrome คุณสามารถใช้เซิร์ฟเวอร์ HTTP (Tomcat) หรือใช้ Firefox แทนก็ได้


4
ฉันใช้ firefox แทนในสถานการณ์ของฉันและมันก็ใช้ได้ Chrome มีความปลอดภัยมากกว่า Firefox หรือไม่? ทำไมฉันถึงได้รับอนุญาตให้ทำสิ่งนี้ ....
thatOneGuy

นั่นคือคำตอบที่ดีที่สุดสำหรับฉัน
โธมัส

1
สั้นและง่าย ... ได้ผล!
viks

ช่วยฉันด้วยจริงๆ
Ram Dutt Shukla

1
เฮ้.. ขอบคุณมาก.. คำตอบของคุณช่วยได้มาก ... ประหยัดเวลาของฉันได้มาก
Megha

31

ปัญหาของฉันได้รับการแก้ไขเพียงแค่เพิ่มhttp://ที่อยู่ URL ของฉัน ตัวอย่างเช่นฉันใช้http://localhost:3000/moviesแทนlocalhost:3000/movies.


13

หากคุณใช้สิ่งนี้ในเบราว์เซอร์ chrome / chromium (เช่นใน Ubuntu 14.04) คุณสามารถใช้คำสั่งใดคำสั่งหนึ่งด้านล่างเพื่อแก้ไขปัญหานี้

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

วิธีนี้จะช่วยให้คุณโหลดไฟล์ในโครเมี่ยมหรือโครเมียม หากคุณต้องดำเนินการเดียวกันสำหรับ windows คุณสามารถเพิ่มสวิตช์นี้ในคุณสมบัติของทางลัดของโครเมี่ยมหรือเรียกใช้cmdด้วยแฟล็ก การดำเนินการนี้ไม่ได้รับอนุญาตใน Chrome, Opera, Internet Explorer โดยค่าเริ่มต้น โดยค่าเริ่มต้นจะใช้งานได้เฉพาะใน firefox และ safari ดังนั้นการใช้คำสั่งนี้จะช่วยคุณได้

หรือคุณสามารถโฮสต์บนเว็บเซิร์ฟเวอร์ใดก็ได้ (เช่น Tomcat-java, NodeJS-JS, Tornado-Python ฯลฯ ) ตามภาษาที่คุณถนัด สิ่งนี้จะทำงานจากเบราว์เซอร์ใดก็ได้


12

หากด้วยเหตุผลใดก็ตามที่คุณไม่สามารถโฮสต์ไฟล์จากเว็บเซิร์ฟเวอร์และยังคงต้องการวิธีการโหลดบางส่วนคุณสามารถใช้ngTemplateคำสั่งได้

ด้วยวิธีนี้คุณสามารถรวมมาร์กอัปของคุณไว้ในแท็กสคริปต์ในไฟล์ index.html ของคุณและไม่จำเป็นต้องรวมมาร์กอัปเป็นส่วนหนึ่งของคำสั่งจริง

เพิ่มสิ่งนี้ใน 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>

จากนั้นในคำสั่งของคุณ:

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

เนื่องจากฉันได้แก้ไขโพสต์นี้แล้วให้ใช้ templateUrl: 'tpl-
productColor

5

RootCause:

โปรโตคอลไฟล์ไม่รองรับคำขอข้ามแหล่งที่มาสำหรับ Chrome

แนวทางที่ 1:

ใช้โปรโตคอล http แทนไฟล์ความหมาย: ตั้งค่าเซิร์ฟเวอร์ http เช่น apache หรือ nodejs + http-server

Sotution 2:

เพิ่ม--allow-file-access-from-files หลังจากเป้าหมายทางลัดของ Chrome และเปิดอินสแตนซ์การเรียกดูใหม่โดยใช้ทางลัดนี้

ป้อนคำอธิบายภาพที่นี่

แนวทางที่ 3:

ใช้ Firefox แทน


การใช้ Firefox ช่วยฉัน
Vineeth Subbaraya

5
  1. ติดตั้งเซิร์ฟเวอร์ http รันคำสั่ง npm install http-server -g
  2. เปิดเทอร์มินัลในเส้นทางที่อยู่ใน index.html
  3. เรียกใช้คำสั่ง http-server . -o
  4. สนุกกับมัน!

4

ฉันจะเพิ่มว่าสามารถใช้ xampp ประเภท mamp และวางโครงการของคุณในโฟลเดอร์ htdocs เพื่อให้สามารถเข้าถึงได้บน localhost


2

หากคุณใช้งานเซิร์ฟเวอร์อยู่แล้วอย่าลืมใช้http: //ในการเรียก API ซึ่งอาจทำให้เกิดปัญหาร้ายแรง


ขอบคุณสองชั่วโมงที่กำลังมองหาวิธีแก้ปัญหาเดียวกันและนี่คือ ...
Santi Nunez

ยินดีต้อนรับครับ. Happy Coding :)
Edison D'souza

1

เหตุผล

คุณไม่ได้เปิดเพจผ่านเซิร์ฟเวอร์เช่น Apache ดังนั้นเมื่อเบราว์เซอร์พยายามรับทรัพยากรจึงคิดว่ามาจากโดเมนแยกต่างหากซึ่งไม่ได้รับอนุญาต แม้ว่าบางเบราว์เซอร์จะอนุญาต

การแก้ไขปัญหา

เรียกใช้ inetmgr และโฮสต์เพจของคุณในเครื่องและเรียกดูเป็นhttp: // localhost: portnumber / PageName.htmlหรือผ่านเว็บเซิร์ฟเวอร์เช่น Apache, nginx, node เป็นต้น

หรือใช้เบราว์เซอร์อื่นไม่มีข้อผิดพลาดปรากฏขึ้นเมื่อเปิดหน้าโดยตรงโดยใช้ Firefox และ Safari มาเฉพาะสำหรับ Chrome และ IE (xx)

หากคุณใช้โปรแกรมแก้ไขโค้ดเช่น Brackets, Sublime หรือ Notepad ++ แอปเหล่านั้นจะจัดการข้อผิดพลาดนี้โดยอัตโนมัติ


1

ปัญหานี้ไม่เกิดขึ้นใน Firefox และ Safari ตรวจสอบให้แน่ใจว่าคุณใช้ xml2json.js เวอร์ชันล่าสุด เนื่องจากฉันประสบกับข้อผิดพลาดตัวแยกวิเคราะห์ XML ใน IE ใน Chrome วิธีที่ดีที่สุดคุณควรเปิดในเซิร์ฟเวอร์เช่น Apache หรือ XAMPP


1

มีส่วนขยาย chrome 200ok ซึ่งเป็นเว็บเซิร์ฟเวอร์สำหรับ chrome เพียงแค่เพิ่มและเลือกโฟลเดอร์ของคุณ


ทางออกที่ยอดเยี่ยม
Mohamed Adel

0

คุณต้องเปิด chrome โดยใช้แฟล็กต่อไปนี้ Go to run menu และพิมพ์ "chrome --disable-web-security --user-data-dir"

ตรวจสอบให้แน่ใจว่าทุกอินสแตนซ์ของ Chrome ปิดอยู่ก่อนที่คุณจะใช้แฟล็กเพื่อเปิด chrome คุณจะได้รับคำเตือนด้านความปลอดภัยที่ระบุว่า CORS ถูกเปิดใช้งาน


0

การเพิ่มโซลูชันที่ยอดเยี่ยมของ @Kirill Fuchs และตอบข้อสงสัยของ @ StackUser - ในขณะที่เริ่มเซิร์ฟเวอร์ http ให้กำหนดเส้นทางจนถึงโฟลเดอร์แอปเท่านั้นไม่ใช่จนถึงหน้า html! http-server C:\location\to\appและเข้าถึงindex.htmlภายใต้appโฟลเดอร์


0

ไปที่ C: /user/project/index.html เปิดด้วย Visual Studio 2017, ไฟล์> ดูในเบราว์เซอร์หรือกด Ctrl + Shift + W


-1

ฉันมีปัญหาเดียวกัน หลังจากเพิ่มโค้ดด้านล่างลงในไฟล์ app.js ของฉันมันได้รับการแก้ไข

var cors = require('cors')
app.use(cors());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.