Error [ERR_STREAM_WRITE_AFTER_END]: write after end [npm-request with socket.io]

24,874

Solution 1

Problem:

You are listening to the 'data' event even after returning the response.

Solution:

Use .once to listen to the event for one time for that one particular request.

socket_g.once("data", function(data) { 

Solution 2

I had a similiar issue. My solution was to:

  1. Check current version of node nvm list => in my case was v9.5.0
  2. Using nvm change to another node version nvm use 10.10.0
  3. Uninstall that node version nvm uninstall 9.5.0
  4. Reinstall that node version nvm install 9.5.0
  5. Change back to that node version nvm use 9.5.0

And it was solved!

Share:
24,874
Normurod
Author by

Normurod

Updated on October 07, 2020

Comments

  • Normurod
    Normurod over 3 years

    On my server side I have socket server listening and in my own laptop I have socket.io-client service and whenever I turn on both they are connecting.

    And when other people request to my server, server sends that request via socket to my laptop and my laptop gets data from localhost using npm-request and gives back the returned data to the server then server show that information to the client.

    And here is the error on my server side:

    /*
    
    throw er; // Unhandled 'error' event
          ^
    
    **Error [ERR_STREAM_WRITE_AFTER_END]: write after end**
        at write_ (_http_outgoing.js:572:17)
        at ServerResponse.write (_http_outgoing.js:567:10)
        at Socket.<anonymous> (/public_html/api/index.js:37:9)
        at Socket.emit (events.js:187:15)
        at /public_html/api/node_modules/socket.io/lib/socket.js:528:12
        at process._tickCallback (internal/process/next_tick.js:61:11)
    Emitted 'error' event at:
        at writeAfterEndNT (_http_outgoing.js:634:7)
        at process._tickCallback (internal/process/next_tick.js:63:19)
    
        */
    

    server side code:

    var http = require('http');
    var fs = require('fs');
    var socket_g=null, numOfUsers=0;
    var url = require('url'),qs = require('querystring');
    
    var server = http.createServer(function(req, res) {
        if(numOfUsers!=0){
              var urlParts = url.parse(req.url, true),
             urlParams = urlParts.query, 
             urlPathname = urlParts.pathname,
             body = '',
             reqInfo = {};
    
              req.on('data', function (data) {
                body += data; 
              });
    
              req.on('end', function () {
                reqInfo.urlPathname = urlPathname; 
                reqInfo.urlParams = urlParams; 
                reqInfo.body = qs.parse(body); 
                reqInfo.urlParts = urlParts;
                console.log(reqInfo.urlPathname)
                  socket_g.emit('event', { "path": reqInfo.urlPathname});
              });
    
            socket_g.on('data',function(data){
                  console.log(data.c)
                  if(data.c=='application/x-httpd-php' || data.c=='/'){
                        res.writeHead(200, { 'Content-Type': 'text/html' });
                        res.write(data.data);
                        res.end();
                  }else{
                        res.writeHead(200, { 'Content-Type': data.c });
                        res.write(data.data);
                        res.end();
                  }         
            });
        }else{
            res.writeHead(200, { 'Content-Type': 'text/html' });
                res.end("<h2>There is no client connected!</h2>");
        }
    });
    
    var io = require('socket.io').listen(server);
    io.sockets.setMaxListeners(0);
    
    io.sockets.on('connection', function (socket) {
        /*console msg*/
        console.log('user connected!');
        /*console msg*/
        socket.setMaxListeners(0);
        numOfUsers++;
        socket_g=socket;
        socket.on('disconnect', function(){
            numOfUsers++;
            /*console msg*/
            console.log('user disconnected');
            /*console msg*/
        });
    });
    
    
    server.listen(3333);
    

    And belove my client side code, which is working on my laptop

    var socket = require('socket.io-client')('http://*.*.*.*:3333/');
    var http=require("http");
    var r = require('request');
    var mime = require('mime');
    var path = require('path');
    
    socket.on('connect', function(){
    	console.log("connected");
    });
    
    socket.on('event', function(data){
    	console.log(mime.getType(path.extname(data.path).substr(1)));
    	var contentType=mime.getType(path.extname(data.path).substr(1));
    
      r.get({url: "http://localhost/check"+data.path},
    		function(error, response, body){
    		   //console.log(body);
    		   if(contentType){
    		   	socket.emit('data', { "data": body,'c':contentType });
    		   }
    	});
    
    });
    
    socket.on('disconnect', function(){
    	console.log("disconnected")
    });