2017-08-04 69 views
0

我正在使用節點AWS-SDK將文件上傳到現有的S3存儲桶。使用下面的代碼,文件最終會上傳,但似乎幾次都沒有返回狀態碼。另外,當文件成功上傳時,return語句不會執行。s3文件上傳不返回響應

代碼

exports.create = function(req, res) { 
 
\t var stream = fs.createReadStream(req.file.path); 
 
\t var params = { 
 
\t \t Bucket: 'aws bucket', 
 
\t \t Key: req.file.filename, 
 
\t \t Body: stream, 
 
\t \t ContentLength: req.file.size, 
 
\t \t ContentType: 'audio/mp3' 
 
\t }; 
 
\t var s3upload = s3.upload(params, options).promise(); 
 
\t 
 
\t s3upload 
 
\t \t .then(function(data) { 
 
\t \t \t console.log(data); 
 
\t \t \t return res.sendStatus(201); 
 
\t \t }) 
 
\t \t .catch(function(err) { 
 
\t \t \t return handleError(err); 
 
\t \t }); 
 
}

日誌

POST /api/v0/episode/upload - - ms - - 
 
POST /api/v0/episode/upload - - ms - - 
 
{ Location: 'https://krazykidsradio.s3-us-west-2.amazonaws.com/Parlez-vous%2BFrancais.mp3', 
 
    Bucket: 'krazykidsradio', 
 
    Key: 'Parlez-vous+Francais.mp3', 
 
    ETag: '"f3ecd67cf9ce17a7792ba3adaee93638-11"' }

+1

您正在使用fs.createReadStream()完全錯誤。 – Darkrum

回答

0

我想通了。請求超時時間不足以完成上傳,因此它再次發出呼叫等等。爲了解決這個問題,我將請求的超時設置爲0,並且一直提供請求來完成上傳。有了這個,它會正確地返回201迴應給客戶。

exports.create = function(req, res) { 
    req.setTimeout(0); // <= set a create request to no timeout length. 
    var stream = fs.createReadStream(req.file.path); 
    var params = { 
     Bucket: 'aws bucket', 
     Key: req.file.filename, 
     Body: stream, 
     ContentLength: req.file.size, 
     ContentType: 'audio/mp3' 
    }; 
    var s3upload = s3.upload(params, options).promise(); 
    // return the `Promise` 
    s3upload 
     .then(function(data) { 
      console.log(data); 
      return res.sendStatus(201); 
     }) 
     .catch(function(err) { 
      return handleError(err); 
     }); 
} 
2

此外,當文件成功上傳時,返回語句確實不會執行 。

沒有值爲create()通話return版,見Why is value undefined at .then() chained to Promise?

exports.create = function(req, res) { 
    var stream = fs.createReadStream(req.file.path); 
    var params = { 
     Bucket: 'aws bucket', 
     Key: req.file.filename, 
     Body: stream, 
     ContentLength: req.file.size, 
     ContentType: 'audio/mp3' 
    }; 
    var s3upload = s3.upload(params, options).promise(); 
    // return the `Promise` 
    return s3upload 
     .then(function(data) { 
      console.log(data); 
      return res.sendStatus(201); 
     }) 
     .catch(function(err) { 
      return handleError(err); 
     }); 
}