我有使用Express作为网络应用程序的Node服务器。
此服务器与其他端TCP服务器创建tcp套接字连接。
我正在尝试将tcp数据传递给用户http响应。
它工作正常一段时间,但最后的tcp数据包不会通过管道传输到http响应。
因此,Web浏览器的下载状态已下载99.9%。
我的源代码如下。
任何人都可以帮我解决这个问题吗?
提前致谢。
app.get('/download/*', function(req, res){
var tcpClient = new net.Socket();
tcpClient.connect(port, ip, function() {
// some logic
});
tcpClient.on('data', function(data) {
/* skip ... */
tcpClient.pipe(res); // This method is called once in the 'data' event loop
/* skip ... */
});
tcpClient.on('close', function() {
clog.debug('Connection closed.');
});
tcpClient.on('end', function() {
clog.debug('Connection Ended.');
});
tcpClient.on('error', function(err){
clog.err(err.stack);
});
});
答案 0 :(得分:3)
这不是你应该如何使用.pipe()
。
当您将流输送到另一个流时,您不必自己处理data
事件:管道会处理所有事情。此外,data
事件在每个数据块上发出,这意味着您可能多次管道()流。
您只需要创建并初始化Socket,然后将其传递给您的响应流:
tcpClient.connect(port, ip, function () {
// some logic
this.pipe(res);
});
编辑:当您在评论中进行了精确处理时,第一个块包含元数据,您只想从其上的第二个块进行管道传输。这是一个可能的解决方案:
tcpClient.connect(port, ip, function () {
// some logic
// Only call the handler once, i.e. on the first chunk
this.once('data', function (data) {
// Some logic to process the first chunk
// ...
// Now that the custom logic is done, we can pipe the tcp stream to the response
this.pipe(res);
});
});
作为旁注,如果要在将tcpClient
写入响应对象之前向tcpClient.pipe(transformStream).pipe(res)
添加自定义逻辑,请查看Transform stream。然后你必须: