2014-10-13 1 views
0

방금 ​​ExpressJS 웹 응용 프로그램에서 gcloud-node를 사용하기 시작했으며 매우 기본적인 문제 인 것처럼 보였지만 해결할 수 없습니다.bucket.createReadStream에서 오류를 찾을 수 없습니다.

파일을 업로드 할 수 있습니다. 내가 사용

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 을 나는 t 것을 확신 양동이에 올바른 이름의 파일이 있습니다.

정말 도움이되었으므로 도움이 될 것입니다.

응답 파일이 아니라 로컬 파일 시스템에 파일을 쓰려고 시도했지만 동일한 오류가 발생했습니다.

노력하고 임시 (또는 영구적) 해결 방법은 이것이다 :

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 실패 이유를 내가 알아내는 데 도움이되지 않습니다 옳은.

+0

내가 더 많은 코드가 있다고 생각 문제를 추적하는 데 도움이됩니다. 반환되는 오류는 파일이 존재하지 않는다는 것을 말합니다. 이는 1) 잘못된 양동이에서 파일을 요청했거나 2) 파일을 읽으려고했을 때 파일이 존재하지 않았거나 3) 파일 이름은 단순히 부정확합니다 (.jpg 대 .jpeg와 같은 단순한 무언가 일 수도 있습니다). – Stephen

+0

@Stephen, 고마워, 해결 방법을 보여주는 설명에 몇 가지 코드를 추가했습니다. 파일 이름과 물통이 올바른 것처럼 보입니다. 나는 여러 가지 기술로 동일한 값을 반복해서 테스트했다. 이 코드는 내가 테스트중인 코드를 보여줍니다. https://gist.github.com/ruairitobrien/6dd587ae8e8b14a2ce5c –

+0

추가해 주셔서 감사합니다. 중요한 것은이 함수 (createFile 및 getFile)가 호출 될 때입니다. createFile이 파일 업로드를 완료하기 전에 getFile이 호출되면 너무 빨리 완료되므로 파일이 존재하지 않습니다. 유용 할 수도 있습니다. 필자는 유사한 웹 응용 프로그램을 사용하여 업로드/다운로드 할 수있는 비슷한 응용 프로그램을 작성했습니다 (https://github.com/stephenplusplus/sillycloud – Stephen

답변

1

gcloud-node의 오래된 버전을 사용하고 계신 것 같습니다. 다음은 최신 버전의 업로드 및 다운로드 방법입니다 (오늘 현재 버전은 v0.14.0입니다). 버킷 (your-bucket-name)에있는 파일 (local-file-name)을 업로드 한 후 local-file-name.download로 다시 그 파일을 다운로드해야이 스크립트를 실행

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(); 

).

일부 참조 (각 페이지에 예제가 있어야한다)을 통해 읽기 :

+0

맞습니다. 최근에 새 버전에서 작업하게되었습니다. 이 질문을 업데이트해야하지만 잊어 버렸습니다. 고맙습니다! –