enable CORS for global access, and remove temp files and add logging
This commit is contained in:
10
README.md
10
README.md
@@ -5,7 +5,15 @@
|
|||||||
```
|
```
|
||||||
sh <(curl https://pkgx.sh) +pnpm sh
|
sh <(curl https://pkgx.sh) +pnpm sh
|
||||||
pnpm install
|
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
|
## dev
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.521.0",
|
"@aws-sdk/client-s3": "^3.521.0",
|
||||||
"@aws-sdk/lib-storage": "^3.521.0",
|
"@aws-sdk/lib-storage": "^3.521.0",
|
||||||
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"multer": "1.4.5-lts.1"
|
"multer": "1.4.5-lts.1"
|
||||||
|
|||||||
11
pnpm-lock.yaml
generated
11
pnpm-lock.yaml
generated
@@ -11,6 +11,9 @@ dependencies:
|
|||||||
'@aws-sdk/lib-storage':
|
'@aws-sdk/lib-storage':
|
||||||
specifier: ^3.521.0
|
specifier: ^3.521.0
|
||||||
version: 3.521.0(@aws-sdk/client-s3@3.521.0)
|
version: 3.521.0(@aws-sdk/client-s3@3.521.0)
|
||||||
|
cors:
|
||||||
|
specifier: ^2.8.5
|
||||||
|
version: 2.8.5
|
||||||
dotenv:
|
dotenv:
|
||||||
specifier: ^16.4.5
|
specifier: ^16.4.5
|
||||||
version: 16.4.5
|
version: 16.4.5
|
||||||
@@ -1238,6 +1241,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
|
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
|
||||||
dev: false
|
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:
|
/debug@2.6.9:
|
||||||
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
|||||||
26
server.js
26
server.js
@@ -1,4 +1,5 @@
|
|||||||
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
|
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
|
||||||
|
const cors = require('cors');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
@@ -7,6 +8,8 @@ const path = require('path');
|
|||||||
require('dotenv').config()
|
require('dotenv').config()
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
app.use(cors());
|
||||||
|
|
||||||
const port = 3000;
|
const port = 3000;
|
||||||
|
|
||||||
// Configure AWS
|
// Configure AWS
|
||||||
@@ -33,7 +36,8 @@ app.post('/image', upload.single('image'), (req, res) => {
|
|||||||
const hashHex = hashSum.digest('hex');
|
const hashHex = hashSum.digest('hex');
|
||||||
|
|
||||||
const bucketName = 'gifts-image';
|
const bucketName = 'gifts-image';
|
||||||
const fileName = `${hashHex}_${file.originalname}`;
|
console.log(file.originalname, '=>', file.path, '=>', hashHex);
|
||||||
|
const fileName = hashHex;
|
||||||
const params = {
|
const params = {
|
||||||
Body: data,
|
Body: data,
|
||||||
Bucket: bucketName, // S3 Bucket name
|
Bucket: bucketName, // S3 Bucket name
|
||||||
@@ -45,11 +49,23 @@ app.post('/image', upload.single('image'), (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const command = new PutObjectCommand(params);
|
const command = new PutObjectCommand(params);
|
||||||
const response = await s3Client.send(command);
|
const response = await s3Client.send(command);
|
||||||
const finalUrl = `https://${bucketName}.s3.amazonaws.com/${fileName}`;
|
if (response.$metadata.httpStatusCode !== 200) {
|
||||||
res.send(JSON.stringify({ success: true, url: finalUrl }));
|
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) {
|
} catch (uploadError) {
|
||||||
console.error('Error uploading to S3:', uploadError);
|
const errorTime = new Date().toISOString();
|
||||||
res.status(500).send(JSON.stringify({ success: false, message: 'Error uploading file.' }));
|
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) }));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user