【问题标题】:Pipe data to string Google Node API管道数据到字符串 Google Node API
【发布时间】:2016-11-10 03:47:39
【问题描述】:

我正在使用 Google API 节点客户端从我的 google 驱动器下载 pdf,但我不知道如何访问来自 service.files.get 函数的数据。我的代码如下:

function download(auth, fileId) {
    var service = google.drive('v3');
    var dest   = fs.createWriteStream('something.pdf');

    service.files.get({
        auth: auth,
        fileId: fileId,
        alt: 'media'
    })
    .on('data', function(chunk){
    console.log(chunk.toString()); // this gives me a JSON response of my bearer token, and not the pdf data
    })
    .on('end', function () {
        console.log('Done');
    })
    .on('error', function (err) {
        console.log('Error during download', err);
    })
    .pipe(dest);
}

我正在使用此下载通过电子邮件发送附件。我不想通过dest 变量将文件保存到我的磁盘,而是希望从download 函数返回一个base64 编码的字符串,但我无法访问来自API 请求的传入数据。谁能指出我访问这个的正确目的地?

如果我按原样运行代码,文件下载正常,但我无法确定 .pdf 数据从哪里流入或如何访问其“数据”事件。

【问题讨论】:

    标签: node.js google-api-nodejs-client


    【解决方案1】:

    尝试将响应主体的块累积到闭包中的变量中。您可以在“结束”事件回调中访问完整的累积。我还提供了一个示例,通过提供给您的下载函数的回调从您的异步函数返回字符串。请注意,您可以改为使用 promises/async/etc. 来执行此操作。 'Stream Consumers' 的 Node.js 'Stream' 文档特别相关 (https://nodejs.org/docs/latest-v5.x/api/stream.html#stream_api_for_stream_consumers)。

    function download(auth, fileId, doneCb) {
      var respData = '';
      var service = google.drive('v3');
    
      service.files.get({
        auth: auth,
        fileId: fileId,
        alt: 'media'
      })
      .on('data', function(chunk) {
        respData += chunk;
      })
      .on('end', function () {
        // respData should contain all of the data now
        doneCb(respData);
      })
      .on('error', function (err) {
        console.log('Error during download', err);
      });
    }
    

    【讨论】:

    • 当我这样做时,我仍然只得到一个包含我的身份验证令牌的 JSON 对象,我不知道为什么。该文件下载正常,但由于某种原因我无法访问数据。 google api 会不会做一些奇怪的事情并且不提供对这些信息的访问权限?
    • 查看 Google Node.js API 客户端快速入门文档后,您似乎不需要任何流式管理。您应该能够访问文件作为传递给完成后触发的回调的第二个参数。 service.files.get({...}, function(err, resp) { resp.resource...}) 指定请求主体 '请求的主体在请求的资源参数对象中指定。 (github.com/google/google-api-nodejs-client#usage)developers.google.com/drive/v3/web/quickstart/nodejs
    • 克拉克你确实是对的,但数据没有像你提到的那样通过 resp.resource 传递。我相信这仅适用于请求。见我上面的回答。感谢您的帮助!
    【解决方案2】:

    在研究了 GitHub 上的 API 问题后,我发现了如何获取下载响应数据。这是通过传递给为您提供响应数据的函数的第二个参数。我可以通过 promise 或回调将数据传回,如下所示:

    service.files.get({
        auth: auth,
        fileId: fileId,
        alt: 'media'
    }, {
        encoding: null // make sure that we get the binary data
    }, function (err, buffer) {
        // I wrap this in a promise to handle the data
        if (err) reject(err);
        else resolve(buffer);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多