管道 got.stream 到一个文件
Piping got.stream to a file
我正在重构一些在 Node 中使用 http
模块的代码,改为使用 got
。我尝试了以下方法:
function get(url, filePath) {
return new Promise((resolve, reject) => {
got.stream(url).on
("response", response => {
const newFile = fs.createWriteStream(filePath);
response.pipe(newFile);
newFile.on("finish", () => {
newFile.close(resolve());
});
newFile.on("error", err => {
reject(err);
});
}).on
("error", err => {
reject(err);
});
});
}
finish
事件从未触发。文件 (filePath
) 是用 0 字节创建的。
使用 newFile
的代码块在我使用节点 http
模块时有效。
将 got.stream
传输到文件的正确方法是什么?
根据 got()
documentation,您希望将流直接通过管道传输到您的文件,如果您使用 pipeline()
执行此操作,它将收集错误并报告完成。
const pipeline = promisify(stream.pipeline);
const fsp = require('fs').promises;
function get(url, filePath) {
return pipeline(
got.stream(url),
fs.createWriteStream(filePath)
);
}
// usage
get(...).then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
仅供参考,got.stream()
的要点是 return 一个流,您可以直接将其用作流,并且由于您希望它转到文件,因此可以将该流通过管道传输到该文件文件。我使用 pipeline()
而不是 .pipe()
因为管道有比 .pipe()
更完整的错误处理,尽管在非错误条件下,.pipe()
也可以工作。
这是一个在出现错误时清理输出文件的版本:
function get(url, filePath) {
return pipeline(
got.stream(url),
fs.createWriteStream(filePath)
).catch(err => {
fsp.unlink(filePath).catch(err => {
if (err.code !== 'ENOENT') {
// trying to delete output file upon error
console.log('error trying to delete output file', err);
}
});
throw err;
});
}
我正在重构一些在 Node 中使用 http
模块的代码,改为使用 got
。我尝试了以下方法:
function get(url, filePath) {
return new Promise((resolve, reject) => {
got.stream(url).on
("response", response => {
const newFile = fs.createWriteStream(filePath);
response.pipe(newFile);
newFile.on("finish", () => {
newFile.close(resolve());
});
newFile.on("error", err => {
reject(err);
});
}).on
("error", err => {
reject(err);
});
});
}
finish
事件从未触发。文件 (filePath
) 是用 0 字节创建的。
使用 newFile
的代码块在我使用节点 http
模块时有效。
将 got.stream
传输到文件的正确方法是什么?
根据 got()
documentation,您希望将流直接通过管道传输到您的文件,如果您使用 pipeline()
执行此操作,它将收集错误并报告完成。
const pipeline = promisify(stream.pipeline);
const fsp = require('fs').promises;
function get(url, filePath) {
return pipeline(
got.stream(url),
fs.createWriteStream(filePath)
);
}
// usage
get(...).then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
仅供参考,got.stream()
的要点是 return 一个流,您可以直接将其用作流,并且由于您希望它转到文件,因此可以将该流通过管道传输到该文件文件。我使用 pipeline()
而不是 .pipe()
因为管道有比 .pipe()
更完整的错误处理,尽管在非错误条件下,.pipe()
也可以工作。
这是一个在出现错误时清理输出文件的版本:
function get(url, filePath) {
return pipeline(
got.stream(url),
fs.createWriteStream(filePath)
).catch(err => {
fsp.unlink(filePath).catch(err => {
if (err.code !== 'ENOENT') {
// trying to delete output file upon error
console.log('error trying to delete output file', err);
}
});
throw err;
});
}