【问题标题】:Waiting for a write stream to complete before returning a function在返回函数之前等待写入流完成
【发布时间】:2020-09-29 16:08:56
【问题描述】:

我正在尝试从 Google Drive 中获取几个 JSON 文件,然后将它们导出到我的代码中的对象中。我正在使用写入流在本地创建文件,然后使用JSON.parse() 对其进行解析。这是我当前的实现:

function setDB(dbId, dbName) {
    let database = {};
    drive.files.get({
        fileId: dbId,
        alt: 'media'
    }, {responseType: 'stream'}).then(res => {
        console.log(`Writing to ${dbName}.`);
        const db = fs.createWriteStream(dbName);
        res.data.on('end', () => {
            console.log(`Done downloading file ${dbName}.`);
        }).on('error', err => {
            console.error(`Error downloading file ${dbName}.`);
            throw err;
        }).pipe(db).on('finish', () => {
            database = JSON.parse(fs.readFileSync(`./${dbName}`));
        });
    });
    return database;
}

let variable1 = setDB('variable1Id', 'variable1.json');
let variable2 = setDB('variable2Id', 'variable2.json');
let variable3 = setDB('variable3Id', 'variable3.json');

这里的问题是setDB 返回undefined,因为函数在文件完成下载和流完成写入文件之前返回它的值。我知道我应该使用某种异步/等待,但我找不到放置它们的方式或位置。这也可能不是解决此问题的最佳方法,我很乐意接受有关更好地实现此功能或使代码更简洁或更优雅的任何建议。但是,这里的主要问题是,我该如何让 setDB 返回JSON.parse(fs.readFileSync(`./${dbName}`))

【问题讨论】:

    标签: node.js json async-await google-api


    【解决方案1】:

    我重写了您的代码以返回一个在流 finish 事件上解析并在流 error 上拒绝的承诺。您的原始代码不会等待您的承诺。

    function async setDB(dbId, dbName) {
      const db = fs.createWriteStream(dbName);
      const res = await drive.files.get({
        alt: 'media',
        fileId: dbId,
      }, {responseType: 'stream'});
      console.log(`Writing to ${dbName}.`);
      return new Promise((resolve, reject) => {
        res.data
          .on('end', () => {
            console.log(`Done downloading file ${dbName}.`);
          })
          .on('error', (err) => {
            console.error(`Error downloading file ${dbName}.`);
            reject(err);
          })
          .pipe(db)
          .on('finish', async () => {
            try {
              const fileContent = await fs.readFile(`./${dbName}`);
              resolve(JSON.parse(fileContent));
            } catch (err) {
              reject(err);
            }
          });
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2016-05-08
      相关资源
      最近更新 更多