node.js - 如何创建文件流并异步写入流?
问题描述
我是 TypeScript/JavaScript 和 Node.js 的新手。
现在我正在尝试创建一个文件流并写“你好!” 异步到流。
#!/usr/bin/env node
import fs from 'fs';
function createStream(filePath: string): Promise<fs.WriteStream> {
return new Promise<fs.WriteStream>((resolve, reject) => {
const out = fs.createWriteStream(filePath);
out.on('close', () => {
console.log(filePath + ' closed');
resolve(out);
});
out.on('error', (err: any) => {
console.log(filePath + ' ' + err);
reject(err);
});
});
}
createStream('/tmp/test.txt').then((out:fs.WriteStream) => {
console.log(out);
out.write('Hello!');
out.end();
})
此代码确实创建/tmp/test.txt
但不打印任何内容并且文件为空。
这段代码有什么问题?
解决方案
您不需要使用 来解决承诺,fs.WriteStream
因为它的创建是同步的。只需fs.createWriteStream()
直接调用并将实例传递给您的函数以创建一个在流关闭或错误时解决的 Promise:
#!/usr/bin/env node
import fs from 'fs';
import stream from 'stream';
function promisify(s: stream.Stream): Promise<void> {
return new Promise<void>((resolve, reject) => {
const onClose = () => {
s.off('error', onError);
resolve();
};
const onError = (error: Error) => {
s.off('close', onClose);
reject(error);
};
s.once('close', onClose);
s.once('error', onError);
});
}
const out = fs.createWriteStream('/tmp/test.txt');
promisify(out).then(() => {
console.log('Done');
});
out.write('Hello!');
out.end();
推荐阅读
- c# - 输出文件写入数组到同一行
- c# - 如何解决 AutoMapper.AutoMapperMappingException
- python - 策划游戏,选择猜什么颜色
- c# - 根据给定的字符串选择属性名称
- python - 如何在不使用 Pandas 的情况下设置动态数据路径以在 Python 中保存 CSV 数据
- c++ - 如何使用 c++ 98 在 linux 中进行 glob 文件名模式匹配
- python - Python 无法使用请求和 BeautifulSoup 包打印标题
- ruby-on-rails - 如何在 ruby 中检索活动存储附件 url 作为 json
- php - 如何获取json响应的最后结果
- power-platform - 新环境默认添加了所有用户,无法移除用户?