EventSource的响应具有不是“ text / event-stream”的MIME类型(“ text / html”)。中止连接。标头设置为文本/事件流

时间:2018-12-03 10:35:23

标签: javascript php server-sent-events

嗨,我在使用sse的控制台中收到此错误

EventSource的响应具有不是“ text / event-stream”的MIME类型(“ text / html”)。中止连接。

js代码是:

if (typeof(EventSource) !== "undefined") 
{
    var source = new EventSource("../api/updateWellData.php?uid=<?php echo $node_id ?>");
    source.onmessage = function(event) {
        var response = JSON.parse(event.data);
        document.getElementById("result").innerHTML = response.test;
        // some code like the above line
    };
}  
else 
{
    // refresh the page every 30 secs
} 

PHP代码为:

header('Cache-Control: no-cache');
header("Access-Control-Allow-Origin: *");
header("Content-Type: text/event-stream");

require_once("../resources/config.php");

if (isset($_GET['uid']))
{
    $uid = $_GET['uid'];
    while (1) 
    {
        $query = Query("SELECT * FROM well_data_last WHERE well_detail_id = $uid");
        $result = fetch_array($query);
        echo json_encode($result);
        ob_end_flush();
        flush();
        sleep(1);
    }
}

这是我第一次使用sse,我使用了以下文档:mozilla | w3schools

2 个答案:

答案 0 :(得分:3)

当您的PHP代码以错误的格式输出文本时,会发生此错误。

这可能是PHP错误消息(所有消息均以原始HTML格式输出),或者页面上的其他一些文字不适合the text/event-stream format

如果PHP文件的输出与text/event-stream所要求的格式不匹配,它将退回到使用text/html的位置。 Javascript要求事件流使用text/event-stream内容类型,因此JS控制台将显示错误,但这只是实际问题的征兆-要解决此问题,您需要修复PHP。


对于OP,问题在于他们的echo语句。输出到流的所有数据必须以data:开头,并以换行符\n结尾。流本身必须以另一个换行符结尾,以指示不再跟随data:条消息。

要解决此错误,OP应该更改

echo json_encode($result);

echo "data: " . json_encode($result) . "\n\n";

OP代码的另一个问题是在数据库查询中没有防止SQL注入的保护措施。虽然这与手头的问题无关,但值得指出的是,应该改用准备好的语句。

答案 1 :(得分:0)

我遇到了同样的问题,问题是php文件中出现语法错误,显示了错误消息。