html5 - Ralat EventSource
phpcn_u1582
phpcn_u1582 2017-05-31 10:39:06
0
2
827

错误

Ralat: Tidak dapat menetapkan pengepala selepas ia dihantar.

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消息发送</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发送信息
        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

membalas semua(2)
我想大声告诉你

Masalah telah diselesaikan Anda perlu menambah awalan "data:" dan akhiran "nn" pada data yang dihantar, iaitu "data"+msg+"nn"
Kod pelayan diubah seperti berikut:

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;
给我你的怀抱

Soalan

Selepas respons ekspres dihantar, respons tidak dibenarkan melakukan beberapa operasi seperti pengepala Setintval ialah pemasa, dan kaedah logik anda tidak betul.
Setinval anda telah menolak respons untuk kali pertama, jadi respons seterusnya tidak lagi boleh dikendalikan Memandangkan http adalah sehala tetapi bukan dua hala, kali kedua ialah operasi tidak sah

Penyelesaian

Jika anda mahu pelanggan menerima push acara daripada pelayan, saya syorkan anda menggunakan socketio atau ajax rotation untuk mengendalikannya.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan