国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

html5 – EventSource-Fehler
phpcn_u1582
phpcn_u1582 2017-05-31 10:39:06
0
2
938

錯誤

Fehler: Header k?nnen nach dem Senden nicht festgelegt werden.

at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
at ServerResponse.header (D:\node\javascript-demo\node_modules\express\lib\response.js:730:10)
at ServerResponse.send (D:\node\javascript-demo\node_modules\express\lib\response.js:170:12)
at Timeout.setInterval [as _onTimeout] (D:\node\javascript-demo\routes\eventsource\eventsource.js:8:8)
at ontimeout (timers.js:384:18)
at tryOnTimeout (timers.js:244:5)
at Timer.listOnTimeout (timers.js:214:5) Program node --debug ./bin/www exited with code 1
    
  
const express = require('express');
const router = express.Router();

router.get('/connect',function(req,resp,next){
    resp.append('Content-Type','text/event-stream');
    console.log(req.method);
    setInterval((data)=>{
        resp.send('hello!');
    },1000,'hello');
});


router.get('/html',(req,resp,next)=>{
    resp.render('./eventsource/msgsend_recevie.html');
});module.exports=router;



<!DOCTYPE html>
<html lang="en">
<head>
    <title>EventSource消息發(fā)送</title>
    <style type="text/css">
        *{
            margin:0 auto;
            padding:0;
        }

        p{
            width:440px;
            height:450px;
            border:2px solid;
            margin-top:100px;
        }
</style>
</head>
<body>
    <p>
        <textarea  id="msg_recevie" rows="30" cols="60"></textarea>
    </p>

    <script>
        //使用eventsource發(fā)送信息
        var eventSource = new EventSource('/msg_send/connect');
        eventSource.onmessage=function(e){
            var tx=document.getElementsByTagName('textarea')[0];
            tx.value=e.data;
        };

    </script>
</body>    

</html>
    

phpcn_u1582
phpcn_u1582

Antworte allen(2)
我想大聲告訴你

問題已解決,需要給發(fā)送的數(shù)據(jù)加上"data:"前綴,"nn"后綴,即"data"+msg+"nn"
服務端代碼修改如下:

const express = require('express');
const router = express.Router();
router.get('/connect',function(req,resp,next){
    resp.writeHead(200,{
        "Content-Type":"text/event-stream",
        "Cache-Control":"no-cache",
        "Connection":"keep-alive"
    });

    setInterval(function(){
 
      resp.write("data:"+Date.now()+"\n\n");
    },1000);

});


router.get('/html',(req,resp,next)=>{
    resp.render('./eventsource/msgsend_recevie.html');
});



module.exports=router;
給我你的懷抱

問題

在express的response已經(jīng)send后,response不允許再進行header等一系列的操作,setintval是一個定時器,你的邏輯方式?jīng)]有正確。
你的setintval第一次已經(jīng)把響應推送出去了,那么后面這個響應已經(jīng)不能繼續(xù)操作了,由于http是單向非雙向的,所以第二次是無效的操作

解決方案

如果你希望客戶端能夠接受服務端得事件推送的話,我推薦使用socketio,或者使用ajax輪訓去處理。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage