簡體   English   中英

Event Emmiter使用express.js返回錯誤500,它在一個事件中僅獲得200響應

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

在我的項目中,我有一些痛處,它會引發一些事件:

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");
});

但是當我嘗試執行以下http POST請求時,我遇到了問題:

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

我盡力去做

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

我得到以下回應:

<!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>

你們是否知道發生這種情況的原因以及我將如何解決?

您應該檢查響應是否發送了標頭。 可以通過以下代碼完成:

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

因此,在您的代碼中,通過/my-route路由導致發布的部分將是:

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);
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM