【问题标题】:Not found error in bucket.createReadStream在 bucket.createReadStream 中找不到错误
【发布时间】:2014-10-13 11:15:04
【问题描述】:

我刚开始在 ExpressJS 网络应用程序中使用 gcloud-node,遇到了一个看似非常基本的问题,但我无法弄清楚。

我可以上传文件没问题。我用:

fs.createReadStream(req.files.file.path)
    .pipe(bucket.createWriteStream(name))

在我的谷歌开发者控制台中,我看到存储桶中的文件,例如名称:54314eddacd67fc858bf473f/543ba7bb387b56b908f2b1e4.jpg

当我尝试使用该名称下载时,即:

bucket.createReadStream(file.name)
            .pipe(res)
             .on('error', function(err) {
                    errorResponseHandler.handleError(res, err);
                });

我收到此错误:

uncaughtException: Not Found Error: Not Found at Object.handleResp (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/lib/common/util.js:168:14) at Bucket.makeReq_ (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/lib/storage/index.js:580:10) at Request.Connection.req [as _callback] (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/lib/common/connection.js:251:16) at Request.init.self.callback (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/node_modules/request/request.js:199:22) at Request.emit (events.js:98:17) at Request.onResponse (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/node_modules/request/request.js:1160:14) at Request.emit (events.js:117:20) at IncomingMessage.Request.onResponse.strings (/Users/ruairiobrien/Dev/testApp/node_modules/gcloud/node_modules/request/request.js:1111:12) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:929:16 我已经调试过了,我确定bucket中存在正确名称的文件。

我真的很难过,所以任何帮助都将不胜感激。

我也尝试将文件写入本地文件系统,而不是在响应中,并得到相同的错误。

有效的临时(或永久)解决方法是:

bucket.getSignedUrl({
                action: 'read',
                expires: Math.round(Date.now() / 1000) + (60 * 60 * 24), // 1 day.
                resource: file.name
            }, function (err, url) {
                res.redirect(url);

            });

解决方法工作正常,但无法帮助我弄清楚 createReadStream 失败的原因,因为它表明文件名和存储桶是正确的。

【问题讨论】:

  • 我认为更多代码可能有助于追踪问题。返回的错误是说文件不存在,这可能意味着 1)您从错误的存储桶中请求文件,2)可能在您尝试读取文件时文件不存在,或者 3 ) 文件名完全不正确(可能是 .jpg 与 .jpeg 之类的简单名称)。
  • @Stephen,谢谢,我在描述中添加了一些代码来显示解决方法。看起来文件名和存储桶是正确的。我用不同的技术一遍又一遍地测试了相同的值。这是显示我正在测试的代码的要点:gist.github.com/ruairitobrien/6dd587ae8e8b14a2ce5c
  • 感谢您添加更多内容。现在重要的是何时调用这些函数(createFile 和 getFile)。如果在 createFile 完成上传文件之前调用 getFile,则为时过早,因此文件不存在。以防万一这很有用,我(可能)编写了一个类似的应用程序,它使用流通过(不是特别好看)网络界面上传/下载:github.com/stephenplusplus/sillycloud
  • 我确定该文件已经存在。毫无疑问,我没有看到一些愚蠢的小错误。我会坚持下去,如果我弄清楚了,我会回复。感谢您的示例代码!真的很有帮助。
  • 抱歉,我无法提供更多帮助——如果您发现这是库的错误,请在github.com/GoogleCloudPlatform/gcloud-node 提出新问题——另外,如果您喜欢冒险,我有一个关于更改存储 api 的 PR:github.com/GoogleCloudPlatform/gcloud-node/pull/253 - 随意测试一下,看看问题是否神奇地消失了 :)

标签: node.js gcloud-node


【解决方案1】:

我认为您可能使用的是过时版本的 gcloud-node。以下是我将如何使用最新版本进行上传和下载(截至今天,这是 v0.14.0)。

var fs = require('fs');
var gcloud = require('gcloud');

var project = gcloud({
  projectId: 'your-project-id',
  // keyFilename: '/path/to/your/keyfile.json'
});

var bucket = project.storage().bucket('your-bucket-name');

var filename = 'local-file-name';
var file = bucket.file(filename); // This is a gcloud.File

var getFiles = function() {
  bucket.getFiles(function(err, files) {
    console.log('Files were', files);
  });
};

var createFile = function() {
  fs.createReadStream(filename)
    .pipe(file.createWriteStream())
    .on('error', function (err) {
      console.log('Error!', err);
    })
    .on('complete', function(result) {
      console.log('Complete!', result);
    });
};

var getFile = function() {
  file.createReadStream()
    .pipe(fs.createWriteStream(filename + '.downloaded'))
    .on('error', function(err) {
      console.log('Error downloading!', err);
    });
}

createFile();
getFile();

运行此脚本应在您的存储桶 (your-bucket-name) 上上传一个文件 (local-file-name),然后将该文件下载为 local-file-name.download)。

一些需要通读的参考资料(每个页面上都应该有示例):

【讨论】:

  • 没错。我最近让它与新版本一起工作。我应该更新这个问题但忘记了。谢谢!
猜你喜欢
  • 2021-07-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 2016-05-13
  • 2014-09-07
  • 2013-01-31
  • 2013-07-31
相关资源
最近更新 更多