gpt4 book ai didi

node.js - 我应该用什么代替 readableStream.push ('' )

转载 作者:搜寻专家 更新时间:2023-10-31 23:24:28 28 4
gpt4 key购买 nike

我正在尝试实现可读流的 ._read 功能,当调用 ._read 并且没有数据时会出现问题,文档说我可以 push('') 直到有更多数据出现,并且我应该只在流永远不会有更多数据时 return falsehttps://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 时,我的服务器将音频流式传输到

什么是更聪明的方法?

最佳答案

因此,如果我正确理解代码,您:

  • 收到请求,
  • 向远程端点发出您自己的请求并获取 URL
  • 向该 URL 发出新请求并将其通过管道传递给原始响应。

除了你的方法之外,还有其他方法可以做到这一点,如果你稍微改进命名,即使你的方法在我看来也会更清晰。此外,将巨大的请求拆分为几个责任范围较小的功能可能会有所帮助。

我会这样制作端点:

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,您不必管理流。对于 0.10 之前的 Node 版本,您必须收听“读取”、“数据”等事件,对于较新的 Node 版本,它会得到处理。此外,您在这里甚至不需要它,流足够智能,可以自行处理背压。

关于node.js - 我应该用什么代替 readableStream.push ('' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34520036/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com