Usando Amazon S3 em um aplicativo Node.js.

Se você estiver usando o Node.js para construir projetos da web “genéricos” (como este ), provavelmente você precisará processar e armazenar imagens carregadas pelo usuário em algum ponto.

Usando Amazon S3 em Node.js

Embora o ImageMagick funcione perfeitamente na maioria dos provedores de PaaS, normalmente o espaço do sistema de arquivos “local” é volátil, então você precisa criar seu próprio espaço / estratégia para armazenar imagens ou outro tipo de ativos gerados pelo usuário. Existem, é claro, soluções de gerenciamento de imagens com todos os recursos na nuvem – Cloudinary sendo talvez a mais conhecida no momento.

Mas se você está procurando uma alternativa realmente barata (mas muito confiável), deve dar uma olhada no clássico Amazon S3 . Existem alguns módulos Node.js por aí e tentei alguns deles, mas no final acabei trabalhando com aws-sdk , o “oficial”.

Embora inicialmente tenha ficado um pouco desconcertado com o estilo de documentação detalhado, no final eu achei muito fácil de usar.

Você pode configurá-lo assim ( código IcedCoffeeScript ):

aws = require 'aws-sdk'
env
= process.env

aws
.config.update
accessKeyId
: env.S3_KEY
secretAccessKey
: env.S3_SECRET
region
: env.S3_REGION

s3
= new aws.S3

E aqui está um método de exemplo para fazer upload de um arquivo local (temporário):

exports.upload = (tempFilePath, callback) ->
fileName
= path.basename tempFilePath
await fs.readFile tempFilePath, defer err, data
return callback err if err
await
s3
.putObject
Bucket: env.S3_BUCKET
Key: "pictures/#{fileName}"
ContentType: 'image/jpg'
CacheControl: 'max-age=31536000' # 1 year
Body: data
, defer err
return callback err if err
await fs.unlink tempFilePath, defer err
callback err

Não é exatamente ciência de foguetes, é? …