cari

Rumah  >  Soal Jawab  >  teks badan

html5 - Ralat EventSource

错误

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_u1582phpcn_u15822852 hari yang lalu915

membalas semua(2)saya akan balas

  • 我想大声告诉你

    我想大声告诉你2017-05-31 10:41:06

    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;

    balas
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-31 10:41:06

    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.

    balas
    0
  • Batalbalas