【发布时间】:2021-07-16 22:05:53
【问题描述】:
当我将POST 数据写入我的应用程序时,我会将其写入文件并通过PUT 与其他实例共享。我想从POST 返回每个流的状态(文件和 PUT)。
putResults 是一个数组,它是封闭类的一部分,用于保存每个请求的结果。
如何收集回复?我可以从createWriteStreams 返回一组 Promise,但是我怎么能将req.pipe 给他们呢?你可以流式传输到 Promise 吗?
post(req, res, next) {
let listeners = this.getWriteStreams();
let c = listeners.length;
for (i = 0; i < c; i++) {
req.pipe(listeners[i]);
}
/* What do I put here to return after all requests finish? */
}
put(req, res, next) {
var fstream = fs.createWriteStream(this.path);
req.pipe(fstream);
req.on('end', () => {
fstream.close();
res.status(201).send("OK");
});
req.on('error', (err) => {
res.status(500).send(err);
});
}
createWriteStreams() {
let listeners = [];
// We always want to save to a file
listeners.push(fs.createWriteStream(this.path).on('close', ()=>{
this.putResults.push({ host: hutil.myHost, status: 201 });
}));
// If there are other servers in current env, send to them, too!
let otherGuys = hostutil.otherServers();
if (otherGuys.length > 0) {
for (i = 0; i < otherGuys.length; i++) {
let opts = {
hostname: hutil.fq(otherGuys[i]),
port: this.port,
path: this.endpoint,
method: 'PUT',
};
let req = https.request(opts, res => {
this.putResults.push({ host: opts.hostname, status: res.statusCode});
});
req.on('error', (e) => {
this.putResults.push({ host: opts.hostname, status: e });
});
listeners.push(req);
}
}
return listeners;
}
【问题讨论】:
-
抱歉,您能否添加一张图表来解释它的工作原理以及您想要完成的任务?
-
我不反对图表,但它确实有点太简单了。我在
POST请求中获取数据,并将其流式传输到文件系统和可变数量的PUT请求。问题是我希望原始的POST返回一个response,它聚合了所有streams的responses,并且只有在它们完成后才这样做。 -
当所有四个请求都完成(成功或错误)时,基本上是时候
res.end()了。你需要一个计数器,或者类似Promise.all/.allSettled。 -
让我困惑的是流。我需要从输入请求流式传输到文件 + 3 个输出请求。然后等待关闭文件和对 3 个请求的 3 个响应。太混乱了——我把
Promise.all放在哪里以及如何通过它流式传输?我可以把它放在req.pipe(listeners[i])循环之后吗?
标签: node.js express promise stream