2013-06-23 65 views
6

我有一个BACKGROUND_SCRIPT下面的代码在谷歌Chrome扩展:什么原因导致EventSource在我的Chrome扩展程序中触发错误?

var source = new EventSource("http://www.janywer.freetzi.com/events/groupshout.php"); 
source.addEventListener('message', function (e) { 
    console.log('message', e.data); 
}, false); 
source.addEventListener('open', function (e) { 
    console.log('open'); 
}, false); 
source.addEventListener('error', function (e) { 
    console.log('error') 
}, false); 

我的问题是这样的:每当我加载扩展,它在说“错误”,但我要如何找出究竟是什么触发错误?

回答

6

The specification仅定义为被触发的“错误”事件的几个可能的情况下,它们是:

  • 一个跨域请求发起的,但并没有收到预期的CORS头。这包括:
    • Access-Control-Allow-Origin未设置或与原始URL不匹配。
    • 您已设置withCredentials:true(通过第二个参数EventSource),但服务器未回复Access-Control-Allow-Credentials: true
  • 发生网络错误。
  • http状态不是200,305,401,407,301,302,303或307.
  • 用户代理(浏览器)试图重新建立连接。
  • http状态为200,但Content-Type响应标题不是“文本/事件流”。
  • 发生了重定向,这导致了前一个条件中的一个。

当CORS错误发生时,浏览器通常会记录以下消息发送到所述控制台:

EventSource的不能加载http://example.com/eventsource。 Access-Control-Allow-Origin不允许产生http://origin.example.com

由于某些原因,Chrome在重定向发生时不显示此错误。


你可能已经添加了"http://www.janywer.freetzi.com/*"权限清单文件,造成通过最初的请求。此页面将重定向到不同的域(不含www-前缀)。您可能没有将此域添加到清单文件中,因此Chrome会尝试启用CORS的请求。预期的标题未收到,因此Chrome会中止请求。

这可以通过两种方式解决:

  • 将所有涉及的域您 文件,例如

    "permissions": [ 
        "http://www.janywer.freetzi.com/*", 
        "http://janywer.freetzi.com/*" 
    ] 
    

    (参见Chrome扩展程序文档中match patterns

  • 或让与预期CORS标头的服务器应答。在PHP中:

    header("Access-Control-Allow-Origin: *"); 
    

    这允许任何页面访问您的URL。要限制只能访问您的分机,请使用:

    ​​
相关问题