Search code examples
javascriptnode.jsexpresseventemitter

Event Emmiter returns error 500 with express.js, it only gets 200 response over one event


On my project I have some sore of function that emmits some events:

const express = require('express');
const EventEmitter = require('events');

/*Initialize Body parsers etc etc*/

const emmiter=new EventEmitter();

const emmitFunctionality=function(message){
  if(message==='hello'){
   return emmiter.emit("ok")
  }
  return emmiter.emit("fail");
}

express.post('/my-route',function(req,res,next){

   emmiter.on('ok',function(){
     res.json({status:true})
   });

   emmiter.on('fail',function(){
     res.json({status:fail})
   });

   emmitFunctionality(req.message);
})

app.listen(80,function(){
  console.log("Listening over port: 80");
});

But I have a problem when I try do the following http POST request works fine:

POST http://localhost/my-route -d "{message:'hello'}"

Whilst I try to do

POST http://localhost/my-route -d "{message:'harem'}"

I get the following response:

<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client<br> &nbsp; &nbsp;at validateHeader (_http_outgoing.js:503:11)<br> &nbsp; &nbsp;at ServerResponse.setHeader (_http_outgoing.js:510:3)<br> &nbsp; &nbsp;at ServerResponse.header (/opt/map/node_modules/express/lib/response.js:767:10)<br> &nbsp; &nbsp;at ServerResponse.send (/opt/map/node_modules/express/lib/response.js:170:12)<br> &nbsp; &nbsp;at ServerResponse.json (/opt/map/node_modules/express/lib/response.js:267:15)<br> &nbsp; &nbsp;at EventEmitter.emmiter.on (/opt/map/src/controllers/panel.js:42:9)<br> &nbsp; &nbsp;at EventEmitter.emit (events.js:164:20)<br> &nbsp; &nbsp;at module.exports.self.readAllLinesFromXLSXBufferAndProcessWithACallback (/opt/map/src/services/excell.js:41:20)<br> &nbsp; &nbsp;at /opt/map/src/controllers/panel.js:46:16<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/opt/map/node_modules/express/lib/router/layer.js:95:5)</pre>
</body>
</html>

Do you fellows know the reason why that happens and how I will solve it?


Solution

  • You should check if the response has sent the headers. This can be done via the following piece of code:

    if(!res.headersSent) {
      //send response here
    }
    

    So over your code the section resulting into the post over the /my-route route will be:

    express.post('/my-route',function(req,res,next){
    
       emmiter.on('ok',function(){
         if(!res.headersSent) {
           res.json({status:true})
         }
       });
    
       emmiter.on('fail',function(){
         if(!res.headersSent) {
          res.json({status:fail})
         }
       });
     emmitFunctionality(req.message);
    })