使用 Google Drive API 和 async/await 获取文件缓冲区

Edu*_*nte 2 node.js google-drive-api

我正在尝试获取一些驱动器 pdf 文件的缓冲区,以便我可以解析它并使用数据。

我已经设法使用 async/await 和一个用 promise 包装的“drive.files.list”来获取文件名和 id。现在我需要使用文件 ID 来获取缓冲区然后读取它。

我需要的函数应该返回一个承诺,我可以等待(使用 await)完成以获得缓冲区。(当我从网站响应中获取 pdf 缓冲区时,我的解析器工作正常)

function getBuffer(drive, file) {
  return new Promise((resolve, reject) => {
    /////Google Auth
    var jwToken = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key, ["https://www.googleapis.com/auth/drive"],
      null
    );
    jwToken.authorize((authErr) => {
      if (authErr) {
        return reject([false, "Auth Error: " + authErr]);
      }
    });
    drive.files.get({
      auth: jwToken,
      fileId: file.id,
      alt: 'media',
      supportsAllDrives: true
    }, function (err, res) {
      if (err) {
        return reject('The API returned an error: ' + err);
      };
      console.log(res);
      const buffer = res;
      resolve(buffer);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

var buffer = await getBuffer(drive,files[i]);
Run Code Online (Sandbox Code Playgroud)

我在“console.log(res)”中得到的输出是这样的:

... ??M?7?|???[??A????EBS]??P??r?????j?3?|?I.??i?+? KU???U?:[???,^?t??v??=}'*8??????#??s??No??-??q8E9?/f? ?(?`?j'3 "??-??? ??????[jp&???k??M??vy? In?:a???OlN??u????6 ?n???q?/Y?i4??&%??q?,??p?.ZV&n????2G??????X??Y

D],?ggb?&?N???G??NS?L?\U?^R|_f<??f*?|??]?{?3?-P?~?CS? ?t??>g?Y??#?#7Wj??=?5?????#????5]>}&v??wg??eV?^>?#?{? ???????>O?? z??{8Ij?0?B?.?Cjm?4?????????m?,????????O???fS???cE??g?3( ?G??}d^O??????7????|?H?N??; {??x?b????i]=???~??=??? <??C?? wi??'a?-??p?M?6o?????ve??+??' ...

当我尝试使用解析器 (pdf2json) 时,出现此错误:

“解析PDF时出错:流必须有数据”

提前致谢

Tan*_*ike 5

  • 您想从 Google Drive 下载文件。
  • 您想将下载的数据转换到缓冲区。
  • 您已经能够使用 googleapis 和 Node.js 从 Google Drive 下载文件。

如果我的理解是正确的,这个修改怎么样?在这个修改中,文件被下载为流类型,数据被转换到缓冲区。

修改后的脚本:

从:
drive.files.get({
  auth: jwToken,
  fileId: file.id,
  alt: 'media',
  supportsAllDrives: true
}, function (err, res) {
  if (err) {
    return reject('The API returned an error: ' + err);
  };
  console.log(res);
  const buffer = res;
  resolve(buffer);
});
Run Code Online (Sandbox Code Playgroud) 到:
drive.files.get(
  {
    auth: jwToken,
    fileId: file.id,
    alt: "media",
    supportsAllDrives: true
  },
  { responseType: "stream" },
  function(err, { data }) {
    if (err) {
      return reject("The API returned an error: " + err);
    }
    let buf = [];
    data.on("data", function(e) {
      buf.push(e);
    });
    data.on("end", function() {
      const buffer = Buffer.concat(buf);
      console.log(buffer);
      // fs.writeFile("filename", buffer, err => console.log(err)); // For testing
      resolve(buffer);
    });
  }
);
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 作为测试用例,我可以确认当buffer使用 保存到文件时fs.writeFile("filename", buffer, err => console.log(err));,可以创建下载的文件。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。