我应该用什么来代替readStream.push('')

我正在尝试实现可读stream的._read函数,当._read被调用并且没有数据时会发生问题,文档说我可以push('')直到更多的数据到来,而且我应该只return false当stream将不会有更多的数据时为return false 。 https://nodejs.org/api/stream.html#stream_readable_read_size_1

但它也说,如果我需要这样做,那么我的devise就会出现一些错误。 https://nodejs.org/api/stream.html#stream_stream_push

但我找不到替代scheme。

码:

  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请求stream式audio到我的服务器,我的服务器请求来自example.com的URL,当example.com响应URL时,我的服务器将audiostream式传输到它。

什么是更聪明的方法来做到这一点?

所以,如果我正确地承担代码,你:

  • 接收请求,
  • 向远程端点发送自己的请求并获取一个URL
  • 对该URL做出新的请求并将其传送到原始响应。

除此之外,还有其他方法可以做到这一点,如果您只是稍微改进一下命名方式,即使您的方式对我来说也会更清晰。 而且,将这个庞大的请求分成几个function较小的职能可能会有所帮助。

我会这样做端点:

 let http = require('http'); let https = require('https'); let Readable = require('stream').Readable; let router = require('express').Router(); let buffer = []; /** * Gets some data from a remote host. Calls back when done. * We cannot pipe this directly into your stream chain as we need the complete data to get the end result. */ function getHostname(cb) { https.request({ hostname: 'example.com' }, function(response) { let data = ''; response.on('error', err => cb(err)); // shortened for brewity response.on('data', function(chunk) { data = data + chunk; }); response.on('end', function() { // we're done here. cb(null, data.toString()); }); }); } router.post('/', function(request, response) { // first let's get that url. getHostname(function(err, hostname) { if (err) { return response.status(500).end(); } // now make that other request which we can stream. https.request({ hostname: hostname, method: 'POST' }, function(dataStream) { dataStream.pipe(response); }); }); }); 

现在,正如评论中所说的那样,使用streams2,你不必pipe理你的stream。 在0.10以前的节点版本中,您必须收听“读取”,“数据”等事件,使用较新的节点版本进行处理。 而且,你甚至不需要它,溪stream足够聪明,可以自己处理背压。