NodeJS - >错误:结束后写(仅在第一次请求后)

时间:2017-08-31 14:59:53

标签: node.js http express httprequest httpresponse

在我的快递应用程序中,我有以下路线:

router.get('/generatedData', function (req, res) {

    res.setHeader('Connection'          , 'Transfer-Encoding');
    res.setHeader('Content-Type'        , 'text/html; charset=utf-8');
    res.setHeader('Transfer-Encoding'   , 'chunked');

    var Client = someModule.client;  
    var client = Client();

    client.on('start', function() {  
        console.log('start');
    });

    client.on('data', function(str) {
        console.log('data');
        res.write(str);
    });

    client.on('end', function(msg) { 
        client.stop();
        res.end();
    });

    client.on('err', function(err) { 
        client.stop();
        res.end(err);
    });

    client.on('end', function() {  
          console.log('end');
    });

    client.start();


});

第一次通话时一切正常(控制台)

We've got ourselves a convoy on port 3000
start
data
data
data
data
data
...
data
end
GET /generatedData 200 208.426 ms - -

我获取了所有数据并且正在调用res.end()并成功关闭请求。

问题在第一次请求后开始。我做了完全相同的请求(当然是新的)并且我得到以下错误(控制台):

start
data
data
data
events.js:160
  throw er; // Unhandled 'error' event
  ^

Error: write after end
at ServerResponse.OutgoingMessage.write (_http_outgoing.js:439:15)
at Client.<anonymous> (/Users/xxxx/projects/xxxx/routes/index.js:33:17)
at emitOne (events.js:96:13)
at Client.emit (events.js:188:7)
at FSWatcher.<anonymous> (/Users/xxxx/projects/xxxx/lib/someModule.js:116:32)
at emitTwo (events.js:106:13)
at FSWatcher.emit (events.js:191:7)
at FSEvent.FSWatcher._handle.onchange (fs.js:1412:12)
[nodemon] app crashed - waiting for file changes before starting...

没有调用res.end()就会发生这种情况。 我设法在崩溃前得到一些数据。

如果没有调用res.end(),我怎么能得到这个错误?

我以某种方式保存以前的res实例吗?

谢谢, 阿萨夫

1 个答案:

答案 0 :(得分:0)

有同样的问题。我的模块被EventEmitter扩展了,每次我在路由器中捕获事件时-它停留在那儿,在第二次调用结束时,有两个eventlistener而不是一个。设置“一次”而不是“打开”-对我有用。

kl

代替

client.once('start', function() {  
        console.log('start');
});