【发布时间】:2018-07-31 23:55:48
【问题描述】:
我必须创建一个文件上传,将文件存储在亚马逊 S3 存储桶中,然后将信息写入数据库。
router.post('/report', upload.single('file'), function(req, res, next) {
reportService
.uploadReport(req.body, req.file)
.then(data => {
res.send(data);
})
.catch(err => {
res.send(err);
});
});
这段代码处理调用。它触发以下代码。
function uploadReport(report, file) {
var objectParams = { Bucket: bucketName, Key: file.filename, Body: '' };
var fs = require('fs');
var fileStream = fs.createReadStream(file.path);
fileStream.on('error', function(err) {
console.log('File Error', err);
});
objectParams.Body = fileStream;
return new Promise((resolve, reject) => {
s3.putObject(objectParams)
.promise()
.then(
data => {
resolve(this.addReport(report, data.Location)
.then(response => resolve(response))
.catch(err => {
reject(err);
})
);
},
err => {
reject(err);
}
);
});
}
这段代码将文件上传到我的s3存储桶,上传完成后调用save report function写入数据库。
function addReport(report, url) {
return new Promise((resolve, reject) => {
reportModel
.addReport(report, url)
.then(report => {
resolve(report);
})
.catch(err => {
reject(err);
});
});
}
我知道我的 2 个 Promise 单独工作,但是将它们组合成 1 个 Promise 不会触发任何功能。
我怎样才能正确地将它们组合成 1 个承诺?
【问题讨论】:
-
避免使用
Promiseconstructor antipattern!reportModel.addReport已经返回了一个承诺,所以整个addReport函数可以简化为function addReport(report, url) { return reportModel.addReport(report, url); }或者可能完全删除
标签: javascript node.js amazon-web-services amazon-s3 promise