Koa SSE “write after end”












1















I have been trying to implement an SSE stream with Koa for hours now but got the following error when trying to send a message to my client after initializing the connection.




Error [ERR_STREAM_WRITE_AFTER_END]: write after end




Here's how I set up my SSE:



Client-side:



const source = new EventSource("http://localhost:8080/stream");

this.source.onmessage = (e) => {
console.log("---- RECEIVED MESSAGE: ", e.data);
};

// Catches errors
this.source.onerror = (e) => {
console.log("---- ERROR: ", e.data);
};


Server-side (Koa):



// Entry point to our SSE stream
router.get('/stream', ctx => {

// Set response status, type and headers
ctx.response.status = 200;
ctx.response.type = 'text/event-stream';
ctx.response.set({
'Cache-Control': 'no-cache',
Connection: 'keep-alive',
});

// Called when another route is reached
// Should send to the client the following
ctx.app.on('message', data => {
ctx.res.write(`event: Testn`);
ctx.res.write(`data: This is test datann`);
});
});


The error comes when we call ctx.res.write once a message is received.



Why is my stream ended although nothing explicitly is doing it?
How may I send a message through the stream with Koa?










share|improve this question





























    1















    I have been trying to implement an SSE stream with Koa for hours now but got the following error when trying to send a message to my client after initializing the connection.




    Error [ERR_STREAM_WRITE_AFTER_END]: write after end




    Here's how I set up my SSE:



    Client-side:



    const source = new EventSource("http://localhost:8080/stream");

    this.source.onmessage = (e) => {
    console.log("---- RECEIVED MESSAGE: ", e.data);
    };

    // Catches errors
    this.source.onerror = (e) => {
    console.log("---- ERROR: ", e.data);
    };


    Server-side (Koa):



    // Entry point to our SSE stream
    router.get('/stream', ctx => {

    // Set response status, type and headers
    ctx.response.status = 200;
    ctx.response.type = 'text/event-stream';
    ctx.response.set({
    'Cache-Control': 'no-cache',
    Connection: 'keep-alive',
    });

    // Called when another route is reached
    // Should send to the client the following
    ctx.app.on('message', data => {
    ctx.res.write(`event: Testn`);
    ctx.res.write(`data: This is test datann`);
    });
    });


    The error comes when we call ctx.res.write once a message is received.



    Why is my stream ended although nothing explicitly is doing it?
    How may I send a message through the stream with Koa?










    share|improve this question



























      1












      1








      1








      I have been trying to implement an SSE stream with Koa for hours now but got the following error when trying to send a message to my client after initializing the connection.




      Error [ERR_STREAM_WRITE_AFTER_END]: write after end




      Here's how I set up my SSE:



      Client-side:



      const source = new EventSource("http://localhost:8080/stream");

      this.source.onmessage = (e) => {
      console.log("---- RECEIVED MESSAGE: ", e.data);
      };

      // Catches errors
      this.source.onerror = (e) => {
      console.log("---- ERROR: ", e.data);
      };


      Server-side (Koa):



      // Entry point to our SSE stream
      router.get('/stream', ctx => {

      // Set response status, type and headers
      ctx.response.status = 200;
      ctx.response.type = 'text/event-stream';
      ctx.response.set({
      'Cache-Control': 'no-cache',
      Connection: 'keep-alive',
      });

      // Called when another route is reached
      // Should send to the client the following
      ctx.app.on('message', data => {
      ctx.res.write(`event: Testn`);
      ctx.res.write(`data: This is test datann`);
      });
      });


      The error comes when we call ctx.res.write once a message is received.



      Why is my stream ended although nothing explicitly is doing it?
      How may I send a message through the stream with Koa?










      share|improve this question
















      I have been trying to implement an SSE stream with Koa for hours now but got the following error when trying to send a message to my client after initializing the connection.




      Error [ERR_STREAM_WRITE_AFTER_END]: write after end




      Here's how I set up my SSE:



      Client-side:



      const source = new EventSource("http://localhost:8080/stream");

      this.source.onmessage = (e) => {
      console.log("---- RECEIVED MESSAGE: ", e.data);
      };

      // Catches errors
      this.source.onerror = (e) => {
      console.log("---- ERROR: ", e.data);
      };


      Server-side (Koa):



      // Entry point to our SSE stream
      router.get('/stream', ctx => {

      // Set response status, type and headers
      ctx.response.status = 200;
      ctx.response.type = 'text/event-stream';
      ctx.response.set({
      'Cache-Control': 'no-cache',
      Connection: 'keep-alive',
      });

      // Called when another route is reached
      // Should send to the client the following
      ctx.app.on('message', data => {
      ctx.res.write(`event: Testn`);
      ctx.res.write(`data: This is test datann`);
      });
      });


      The error comes when we call ctx.res.write once a message is received.



      Why is my stream ended although nothing explicitly is doing it?
      How may I send a message through the stream with Koa?







      server-sent-events koa






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 26 '18 at 15:31









      Paul R

      176k24298458




      176k24298458










      asked Nov 26 '18 at 14:43









      ChristopherChristopher

      692525




      692525
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Koa is entirely promise based and everything is a middleware.



          Every middleware returns a promise (or nothing). The middleware chain is effectively 'awaited' and once the middleware returns, Koa knows the response is done and will end the stream.



          To make sure that Koa doesn't do this, you have to make sure that the chain of middlewares don't end. To do this, you need to return a promise that only resolves when you're done streaming.



          A quick hack to demonstrate would be to return a promise that doesn't resolve:



          return new Promise( resolve => { }});





          share|improve this answer


























          • Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

            – Christopher
            Nov 27 '18 at 7:40













          • I guarantee that once you get the hang of it, you'll like it more!

            – Evert
            Nov 27 '18 at 15:16











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53483534%2fkoa-sse-write-after-end%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          Koa is entirely promise based and everything is a middleware.



          Every middleware returns a promise (or nothing). The middleware chain is effectively 'awaited' and once the middleware returns, Koa knows the response is done and will end the stream.



          To make sure that Koa doesn't do this, you have to make sure that the chain of middlewares don't end. To do this, you need to return a promise that only resolves when you're done streaming.



          A quick hack to demonstrate would be to return a promise that doesn't resolve:



          return new Promise( resolve => { }});





          share|improve this answer


























          • Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

            – Christopher
            Nov 27 '18 at 7:40













          • I guarantee that once you get the hang of it, you'll like it more!

            – Evert
            Nov 27 '18 at 15:16
















          1














          Koa is entirely promise based and everything is a middleware.



          Every middleware returns a promise (or nothing). The middleware chain is effectively 'awaited' and once the middleware returns, Koa knows the response is done and will end the stream.



          To make sure that Koa doesn't do this, you have to make sure that the chain of middlewares don't end. To do this, you need to return a promise that only resolves when you're done streaming.



          A quick hack to demonstrate would be to return a promise that doesn't resolve:



          return new Promise( resolve => { }});





          share|improve this answer


























          • Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

            – Christopher
            Nov 27 '18 at 7:40













          • I guarantee that once you get the hang of it, you'll like it more!

            – Evert
            Nov 27 '18 at 15:16














          1












          1








          1







          Koa is entirely promise based and everything is a middleware.



          Every middleware returns a promise (or nothing). The middleware chain is effectively 'awaited' and once the middleware returns, Koa knows the response is done and will end the stream.



          To make sure that Koa doesn't do this, you have to make sure that the chain of middlewares don't end. To do this, you need to return a promise that only resolves when you're done streaming.



          A quick hack to demonstrate would be to return a promise that doesn't resolve:



          return new Promise( resolve => { }});





          share|improve this answer















          Koa is entirely promise based and everything is a middleware.



          Every middleware returns a promise (or nothing). The middleware chain is effectively 'awaited' and once the middleware returns, Koa knows the response is done and will end the stream.



          To make sure that Koa doesn't do this, you have to make sure that the chain of middlewares don't end. To do this, you need to return a promise that only resolves when you're done streaming.



          A quick hack to demonstrate would be to return a promise that doesn't resolve:



          return new Promise( resolve => { }});






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 27 '18 at 15:16

























          answered Nov 26 '18 at 17:34









          EvertEvert

          41.3k1570125




          41.3k1570125













          • Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

            – Christopher
            Nov 27 '18 at 7:40













          • I guarantee that once you get the hang of it, you'll like it more!

            – Evert
            Nov 27 '18 at 15:16



















          • Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

            – Christopher
            Nov 27 '18 at 7:40













          • I guarantee that once you get the hang of it, you'll like it more!

            – Evert
            Nov 27 '18 at 15:16

















          Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

          – Christopher
          Nov 27 '18 at 7:40







          Thank you very much ! The middleware system of Koa is still rather obscure to me coming from Express. Especially when it comes to the execution flow.

          – Christopher
          Nov 27 '18 at 7:40















          I guarantee that once you get the hang of it, you'll like it more!

          – Evert
          Nov 27 '18 at 15:16





          I guarantee that once you get the hang of it, you'll like it more!

          – Evert
          Nov 27 '18 at 15:16




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53483534%2fkoa-sse-write-after-end%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Contact image not getting when fetch all contact list from iPhone by CNContact

          count number of partitions of a set with n elements into k subsets

          A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks