【问题标题】:s3 file upload does not return responses3文件上传不返回响应
【发布时间】:2017-08-09 00:42:17
【问题描述】:

我正在使用 Node AWS-SDK 将文件上传到现有的 S3 存储桶。使用下面的代码,文件最终会上传,但它似乎有几次没有返回状态代码。另外,当文件上传成功时,return语句不会执行。

代码

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();
	
	s3upload
		.then(function(data) {
			console.log(data);
			return res.sendStatus(201);
		})
		.catch(function(err) {
			return handleError(err);
		});
}

日志

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"' }

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-s3


    【解决方案1】:

    另外,当文件成功上传时,return 语句会执行 不执行。

    returned 没有来自create() 调用的值,请参阅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);
            });
    }
    

    【讨论】:

      【解决方案2】:

      我想通了。请求超时时间不足以完成上传,因此它正在再次进行调用,依此类推。为了解决这个问题,我将请求的超时时间设置为 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);
              });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-23
        • 2012-07-10
        • 2019-10-13
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多