在bucket.createReadStream中找不到错误



我刚刚开始在ExpressJS web应用程序中使用gcloud节点,并遇到了一个看似非常基本的问题,但我无法解决。

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

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

在我的谷歌开发者控制台中,我看到了我的bucket中的文件,例如名称为: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失败的原因,因为它表明文件名和bucket是正确的。

我认为您可能使用了gcloud-node的过时版本。以下是我如何使用最新版本进行上传和下载(截至今天,这是0.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();

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

要通读的一些参考资料(每一页都应该有例子):

  • gcloud.storage
  • bucket.getFiles
  • 文件.createReadStream
  • 文件.createWriteStream

相关内容

  • 没有找到相关文章

最新更新