为什么 S3 只存储我循环的最后一项?
Why S3 only stores the last item of my loop?
我正在尝试使用节点 AWS SDK 上传图像,但在使用循环时遇到问题。
这是我的节点模块:
gm = require('gm').subClass imageMagick: true
s3 = require '../../modules/s3'
Photo = require '../../models/Photo'
sizes =
t: 100
m: 240
z: 640
l: 1024
k: 2048
newPhoto = new Photo
newPhotoImg = gm process.cwd() + '/' + req.files.file.path
for key, val of sizes
newPhotoImg
.resize(null, val)
.toBuffer 'jpg', (err, buffer) ->
if err then console.error err and res.status(500).end() else
params =
Key: newPhoto.id + '-' + key + '.jpg'
Body: buffer
ContentType: 'image/jpeg'
s3.putObject params, (err, data) ->
if err then console.error err else console.log data
我的 s3 模块运行良好,很可能不是问题的一部分。
问题是我为每个大小返回了一个 ETag,但是当我查看我的 S3 管理控制台时,只存储了循环的最后一项(大小为 'k')。
有人可以帮我吗?
就像@RistoNovic 说的,我必须对 forEachOf function of async 模块使用异步循环。
uploadSize = (val, key, callback) ->
newPhotoImg
.resize null, val
.toBuffer 'jpg', (err, buffer) ->
if err then callback err else
params =
Key: newPhoto.id + '/' + newPhoto.id + '-' + key + '.jpg'
Body: buffer
ContentType: 'image/jpeg'
s3.putObject params, (err, data) ->
if err then callback err else callback()
async.forEachOf sizes, uploadSize, (err) ->
if err then console.error err and res.status(500).send "Error with uploading image." else
fs.unlinkSync process.cwd() + '/' + req.files.file.path
newPhoto.save (err, doc) ->
if err then console.error and res.status(500).send "Error with saving photo." else
res.send doc
我正在尝试使用节点 AWS SDK 上传图像,但在使用循环时遇到问题。
这是我的节点模块:
gm = require('gm').subClass imageMagick: true
s3 = require '../../modules/s3'
Photo = require '../../models/Photo'
sizes =
t: 100
m: 240
z: 640
l: 1024
k: 2048
newPhoto = new Photo
newPhotoImg = gm process.cwd() + '/' + req.files.file.path
for key, val of sizes
newPhotoImg
.resize(null, val)
.toBuffer 'jpg', (err, buffer) ->
if err then console.error err and res.status(500).end() else
params =
Key: newPhoto.id + '-' + key + '.jpg'
Body: buffer
ContentType: 'image/jpeg'
s3.putObject params, (err, data) ->
if err then console.error err else console.log data
我的 s3 模块运行良好,很可能不是问题的一部分。
问题是我为每个大小返回了一个 ETag,但是当我查看我的 S3 管理控制台时,只存储了循环的最后一项(大小为 'k')。
有人可以帮我吗?
就像@RistoNovic 说的,我必须对 forEachOf function of async 模块使用异步循环。
uploadSize = (val, key, callback) ->
newPhotoImg
.resize null, val
.toBuffer 'jpg', (err, buffer) ->
if err then callback err else
params =
Key: newPhoto.id + '/' + newPhoto.id + '-' + key + '.jpg'
Body: buffer
ContentType: 'image/jpeg'
s3.putObject params, (err, data) ->
if err then callback err else callback()
async.forEachOf sizes, uploadSize, (err) ->
if err then console.error err and res.status(500).send "Error with uploading image." else
fs.unlinkSync process.cwd() + '/' + req.files.file.path
newPhoto.save (err, doc) ->
if err then console.error and res.status(500).send "Error with saving photo." else
res.send doc