문제점 : 노드 4.3 및 그래픽 매직을 사용하여 업로드 된 S3 그림의 크기를 조정하는 AWS 람다 함수를 생성하십시오.배열로 약속을 연결하는 방법
내 문제 : 약속의 흐름에 그림 개체의 배열을 통합하는 방법을 알 수 없습니다. 내가 찾을 수있는 모든 스택 예제는 모든 데이터가 알려졌을 때 약속 된 객체 배열을 보여줍니다. 하지만 먼저 이미지 데이터를 읽은 다음 크기 조정 기능에 전달해야합니다.
아래 기능은 resizePicture가 해결되기 전에 완료됩니다. 문제가 반환되지 않는다는 것을 알고 올바른 순서로 약속 및 해결합니다. 나는 혼란 스럽다.
var pictureSizes = [
{width: 100, size: 'thumbnail', suffix: '_t'},
{width: 300, size: 'small', suffix: '_s'},
{width: 600, size: 'medium', suffix: '_m'},
{width: 1000, size: 'large', suffix: '_l'}
];
exports.handler = function(event, context) {
var srcBucket = event.Records[0].s3.bucket.name;.
var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
var dstBucket = srcBucket + "pictures";
var typeMatch = srcKey.match(/\.([^.]*)$/);
var fileName = path.basename(srcKey);
downloadImage({ Bucket: srcBucket, Key: srcKey})
.then(result => pictureSizes.map(picture => resizePicture(result, picture)))
.then(result => saveImage(result, dstBucket, fileName))
.catch(err => console.log('error', err))
}
function downloadImage(params) {
console.log('download Image', params);
return new Promise(function(resolve, reject) {
s3.getObject(params, function(err, data) {
if (err) {
reject(err);
}
resolve(data);
})
});
}
function resizePicture(result, picture) {
return new Promise(function(resolve, reject) {
const extension = result.ContentType.split('/')[1];
gm(result.Body)
.resize(picture.width)
.toBuffer(extension, function(err, buffer) {
if (err) {
reject(err);
} else {
resolve({
key: `${picture.suffix}.${extension}`,
binary: buffer,
ContentType: result.contentType
})
}
});
})
}
function saveImage(result, dstBucket, fileName) {
return new Promise(function(resolve, reject) {
s3.putObject({
Bucket: dstBucket,
Key: `${fileName}${result.key}`,
Body: result.binary,
ContentType: result.ContentType
}, function(err, data) {
if (err) {
reject(err);
}
resolve(data);
})
})
}
가, 감사합니다! 만약 당신이 중첩 된 호출없이 그것을 만드는 방법을 안다면, 나는 더 좋은 기능적 프로그래머가 되려고 노력하고 싶다. –