我正在使用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"' }
答案 0 :(得分:3)
此外,当文件成功上传时,return语句会执行 不执行。
来自return
来电的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);
});
}
答案 1 :(得分:1)
我明白了。请求超时时间不足以完成上传,因此它再次进行呼叫,依此类推等等。要解决此问题,我将请求的超时设置为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);
});
}