node.js - 如何创建文件流并异步写入流?

标签 node.js typescript file promise

我是 TypeScript/JavaScript 和 Node 的新手。
现在我正在尝试创建一个文件流并写入“Hello!”异步到流。

#!/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 解析 Promise,因为它的创建是同步的。只需直接调用 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();

关于node.js - 如何创建文件流并异步写入流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379031/

相关文章:

mysql - 一个全栈网站需要运行多少个 NodeJS 项目?

javascript - 如何在 Node.js 中使用 Promise 对 API 进行递归请求?

node.js - Node.js使用OpenSSL数字签名和验证日志文件

typescript - 类定义的双重断言

TFS 中的文件未显示在解决方案资源管理器中

javascript - Node/ express 4 : displaying errors with express-validator on ajax post

javascript - 导出函数遇到“ Uncaught SyntaxError :意外的 token 导出”时

typescript - 在 VSCode 中调试 lerna-typescript 项目

Java:文件重命名检测

javascript - 关于 Linux 上 Javascript 中的文件处理