在我的快递应用程序中,我有以下路线:
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
实例吗?
谢谢, 阿萨夫
答案 0 :(得分:0)
有同样的问题。我的模块被EventEmitter扩展了,每次我在路由器中捕获事件时-它停留在那儿,在第二次调用结束时,有两个eventlistener而不是一个。设置“一次”而不是“打开”-对我有用。
kl
代替
client.once('start', function() {
console.log('start');
});