【发布时间】:2015-12-29 22:22:21
【问题描述】:
我正在尝试实现可读流的._read 函数,当调用._read 并且没有数据时会出现问题,文档说我可以push('') 直到有更多数据出现,我当流永远不会有更多数据时,应该只return false。
https://nodejs.org/api/stream.html#stream_readable_read_size_1
但它也表示,如果我需要这样做,那么我的设计就出现了严重错误。 https://nodejs.org/api/stream.html#stream_stream_push
但我找不到替代方案。
代码:
var http = require('http');
var https = require('https');
var Readable = require('stream').Readable;
var router = require('express').Router();
var buffer = [];
router.post('/', function(clientRequest, clientResponse) {
var delayedMSStream = new Readable;
delayedMSStream._read = function() {
var a=buffer.shift();
if(typeof a === 'undefined'){
this.push('');
return true;
}
else {
this.push(a);
if(a===null) {
return false;
}
return true;
}
};
//I need to get a url from example.com
https.request({hostname:'example.com'}, function(exampleResponse){
data='';
exampleResponse.on('data',function(chunk){data+=chunk});
exampleResponse.on('end',function(){
var MSRequestOptions = {hostname: data, method: 'POST'};
var MSRequest = https.request(MSRequestOptions, function(MSResponse){
MSResponse.on('end', function () {
console.log("MSResponse.on(end)");//>>>
});//end MSResponse.on(end)
}); //end MSRequest
delayedMSStream.pipe(MSRequest);
});
});
clientRequest.on('data', function (chunk) {
buffer.push(chunk);
});
clientRequest.on('end', function () {//when done streaming audio
buffer.push(null);
});
});//end router.post('/')
解释:
客户端向我的服务器发送一个 POST 请求流式音频,我的服务器从example.com 请求一个 url,当example.com 响应该 url 时,我的服务器将音频流式传输给它。
什么是更聪明的方法?
【问题讨论】:
-
什么是
buffer?你从哪里得到的? -
clientRequest.on('data',function(chunk){ buffer.push(chunk); });它在代码中^
-
不,我没看到 - 你得到一个
chunk并将其推送到 缓冲区。但我看不出你在哪里定义了缓冲区。 -
哦,对不起,我误解了你的评论,刚刚修复它,
var buffer=[]; -
在这种情况下,我认为您可能误读了文档的“推送返回错误”部分。它是您的 _read 函数中的
let result = this.push(chunk);。如果结果为假,则流应停止发送数据一段时间(意味着另一端无法接收更多数据)。但这是一种内部方法/检查,仅适用于旧流,不适用于流 2。