From 0d7020daf7fd14ff73f576a027a49a21b45c4d50 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Sat, 2 Mar 2024 17:45:35 -0700 Subject: [PATCH] enable CORS for global access, and remove temp files and add logging --- README.md | 10 +++++++++- package.json | 1 + pnpm-lock.yaml | 11 +++++++++++ server.js | 26 +++++++++++++++++++++----- 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6afbd88..3c035be 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,15 @@ ``` sh <(curl https://pkgx.sh) +pnpm sh pnpm install -# manually set the AWS_ variables inside the .env file +# create the directory for files that are being uploaded; should stay empty afterward +mkdir uploads +``` + +Now manually set these AWS_ variables inside a .env file: +``` +AWS_ACCESS_KEY= +AWS_SECRET_KEY= +AWS_REGION= ``` ## dev diff --git a/package.json b/package.json index e1a699f..066b323 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.521.0", "@aws-sdk/lib-storage": "^3.521.0", + "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.2", "multer": "1.4.5-lts.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19981e5..eb1bb19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@aws-sdk/lib-storage': specifier: ^3.521.0 version: 3.521.0(@aws-sdk/client-s3@3.521.0) + cors: + specifier: ^2.8.5 + version: 2.8.5 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -1238,6 +1241,14 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: diff --git a/server.js b/server.js index 6dba451..89ff685 100644 --- a/server.js +++ b/server.js @@ -1,4 +1,5 @@ const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); +const cors = require('cors'); const crypto = require('crypto'); const express = require('express'); const fs = require('fs'); @@ -7,6 +8,8 @@ const path = require('path'); require('dotenv').config() const app = express(); +app.use(cors()); + const port = 3000; // Configure AWS @@ -33,7 +36,8 @@ app.post('/image', upload.single('image'), (req, res) => { const hashHex = hashSum.digest('hex'); const bucketName = 'gifts-image'; - const fileName = `${hashHex}_${file.originalname}`; + console.log(file.originalname, '=>', file.path, '=>', hashHex); + const fileName = hashHex; const params = { Body: data, Bucket: bucketName, // S3 Bucket name @@ -45,11 +49,23 @@ app.post('/image', upload.single('image'), (req, res) => { try { const command = new PutObjectCommand(params); const response = await s3Client.send(command); - const finalUrl = `https://${bucketName}.s3.amazonaws.com/${fileName}`; - res.send(JSON.stringify({ success: true, url: finalUrl })); + if (response.$metadata.httpStatusCode !== 200) { + const errorTime = new Date().toISOString(); + console.log(errorTime, "Error uploading to S3 with bad HTTP status. Metadata:", response.$metadata); + res.status(500).send(JSON.stringify({ success: false, message: "Got bad status of " + response.$metadata.httpStatusCode + " from AWS. See server logs at " + errorTime })); + } else { + const finalUrl = `https://${bucketName}.s3.amazonaws.com/${fileName}`; + fs.rm(file.path, (err) => { + if (err) { + console.error("Error deleting temp file", file.path, "with error:", err); + } + }); + res.send(JSON.stringify({ success: true, url: finalUrl })); + } } catch (uploadError) { - console.error('Error uploading to S3:', uploadError); - res.status(500).send(JSON.stringify({ success: false, message: 'Error uploading file.' })); + const errorTime = new Date().toISOString(); + console.error(errorTime, "Error uploading to S3:", uploadError); + res.status(500).send(JSON.stringify({ success: false, message: "Got error uploading file. See server logs at " + errorTime + " Error Details: " + JSON.stringify(uploadError) })); } }); });