اتصال به فضای ذخیره‌سازی ابری در برنامه‌های NodeJS


پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.

برای استفاده از Object Storage در برنامه‌های NodeJS، می‌توانید از پکیج aws-sdk/client-s3 استفاده کنید که بایستی با دستور زیر، آن را در پروژه خود، نصب کنید:

کپی
npm install @aws-sdk/client-s3

پس از آن، کافیست تا طبق مستندات ایجاد کلید، یک کلید جدید برای باکت خود بسازید. اطلاعات مربوط به ENDPOINT و نام باکت نیز در صفحه تنظیمات، در بخش دسترسی با SDK، برای شما قرار گرفته است. در نهایت نیز، بایستی اطلاعات مربوط به Object Storage خود را به متغیرهای محیطی برنامه خود، اضافه کنید؛ به عنوان مثال:

کپی
LIARA_ENDPOINT=https://<Liara Bucket Endpoint>
LIARA_BUCKET_NAME=<Bucket Name>
LIARA_ACCESS_KEY=<Access Key>
LIARA_SECRET_KEY=<Secret Key>

تمامی کارها انجام شده است و می‌توانید از Object Storage در برنامه خود، استفاده کنید؛ در ادامه، مثال‌هایی از این مورد برای‌تان آورده شده است:

نمونه کد آپلود فایل

کپی
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
require("dotenv").config();

const client = new S3Client({
  region: "default",
endpoint: process.env.LIARA_ENDPOINT,
credentials: {
	accessKeyId: process.env.LIARA_ACCESS_KEY,
	secretAccessKey: process.env.LIARA_SECRET_KEY
},
});

const params = {
Body: "<Binary String>",
Bucket: process.env.LIARA_BUCKET_NAME,
Key: "objectkey",
};

// async/await
try {
await client.send(new PutObjectCommand(params));
} catch (error) {
console.log(error);
}

// callback
client.send(new PutObjectCommand(params), (error, data) => {
if (error) {
  console.log(error);
} else {
  console.log(data);
}
});

نمونه کد دانلود فایل

کپی
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
require("dotenv").config();

const client = new S3Client({
  region: "default",
endpoint: process.env.LIARA_ENDPOINT,
credentials: {
	accessKeyId: process.env.LIARA_ACCESS_KEY,
	secretAccessKey: process.env.LIARA_SECRET_KEY
},
});
const params = {
Bucket: process.env(LIARA_BUCKET_NAME),
Key: "objectkey"
};

// async/await
try {
const data = await client.send(new GetObjectCommand(params));
console.log(data.Body.toString());
} catch (error) {
console.log(error);
}

// callback
client.send(new GetObjectCommand(params), (error, data) => {
if (error) {
  console.log(error);
} else {
  console.log(data.Body.toString());
}
});

نمونه کد دریافت لینک دانلود فایل

کپی
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
require("dotenv").config();

const filename = "example_filename.png"; // change this to your filename

const client = new S3Client({
region: "default",
endpoint: process.env.LIARA_ENDPOINT,
credentials: {
  accessKeyId: process.env.LIARA_ACCESS_KEY,
  secretAccessKey: process.env.LIARA_SECRET_KEY,
},
});
const params = {
Bucket: process.env.LIARA_BUCKET_NAME,
Key: filename,
};

const command = new GetObjectCommand(params);
getSignedUrl(client, command).then((url) => console.log(url));

نمونه کد دریافت لینک دانلود فایل با دامنه اختصاصی

اگر طبق مستندات اتصال دامنه، یک دامنه اختصاصی به باکت خود متصل کرده‌اید، ساده‌ترین روش برای دریافت لینک دانلود (Presigned) با دامنه اختصاصی این است که لینک را با Endpoint اصلی لیارا تولید کنید و سپس مقدار Host آن را به دامنه اختصاصی تغییر دهید. با این روش، نیازی به استفاده از bucketEndpoint یا forcePathStyle و ساخت کلاینت جداگانه برای دامنه اختصاصی نیست و تمامی کارها با همان کلاینت اصلی انجام می‌شود:

کپی
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
require("dotenv").config();

const client = new S3Client({
region: "default",
endpoint: process.env.LIARA_ENDPOINT,
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
credentials: {
  accessKeyId: process.env.LIARA_ACCESS_KEY,
  secretAccessKey: process.env.LIARA_SECRET_KEY,
},
});

async function main() {
const signed = await getSignedUrl(
  client,
  new GetObjectCommand({
    Bucket: process.env.LIARA_BUCKET_NAME,
    Key: "example_filename.png", // change this to your filename
  }),
  { expiresIn: 3600 }
);

const url = new URL(signed);
url.host = "example.com"; // change this to your custom domain

console.log(url.toString());
}

main();

فقط مقدار host را تغییر دهید و پارامترهای *-X-Amz موجود در لینک را دستکاری نکنید؛ در غیر این صورت امضای لینک نامعتبر می‌شود و دسترسی به فایل با خطا مواجه خواهد شد.

نمونه کد دریافت لیست فایل‌های موجود در باکت

کپی
const { S3Client, ListObjectsV2Command } = require("@aws-sdk/client-s3");
require("dotenv").config();

const client = new S3Client({
  region: "default",
endpoint: process.env.LIARA_ENDPOINT,
credentials: {
	accessKeyId: process.env.LIARA_ACCESS_KEY,
	secretAccessKey: process.env.LIARA_SECRET_KEY
},
});

const params = {
Bucket: process.env.LIARA_BUCKET_NAME
};

// async/await
try {
const data = await client.send(new ListObjectsV2Command(params));
const files = data.Contents.map((file) => file.Key);
console.log(files);
} catch (error) {
console.log(error);
}

// callback
client.send(new ListObjectsV2Command(params), (error, data) => {
if (error) {
  console.log(error);
} else {
  const files = data.Contents.map((file) => file.Key);
  console.log(files);
}
});

نمونه کد حذف فایل

کپی
const { S3Client, DeleteObjectCommand } = require("@aws-sdk/client-s3");
require("dotenv").config();

const client = new S3Client({
  region: "default",
endpoint: process.env.LIARA_ENDPOINT,
credentials: {
	accessKeyId: process.env.LIARA_ACCESS_KEY,
	secretAccessKey: process.env.LIARA_SECRET_KEY
},
});

const params = {
Bucket: process.env.LIARA_BUCKET_NAME,
Key: "objectkey"
};

// async/await
try {
await client.send(new DeleteObjectCommand(params));
console.log("File deleted successfully");
} catch (error) {
console.log(error);
}

// callback
client.send(new DeleteObjectCommand(params), (error, data) => {
if (error) {
  console.log(error);
} else {
  console.log("File deleted successfully");
}
});

نمونه کد نمایش لیست باکت‌ها

کپی
const { S3Client, ListBucketsCommand } = require("@aws-sdk/client-s3");
require("dotenv").config();

const client = new S3Client({
region: "default",
endpoint: process.env.LIARA_ENDPOINT,
credentials: {
	accessKeyId: process.env.LIARA_ACCESS_KEY,
	secretAccessKey: process.env.LIARA_SECRET_KEY,
},
});


client.send(new ListBucketsCommand({}), (error, data) => {
if (error) {
  console.log(error);
} else {
  const buckets = data.Buckets.map((bucket) => bucket.Name);
  console.log(buckets); // List of bucket names
}
});

نمونه کد آپلود فایل از طریق multer

کپی
import AWS from 'aws-sdk';
import multer from 'multer';
import express from 'express';
import multerS3 from 'multer-s3';

const config = {
endpoint: process.env(LIARA_ENDPOINT),
accessKeyId: process.env(LIARA_ACCESS_KEY),
secretAccessKey: process.env(LIARA_SECRET_KEY),
region: "default",
};

const app = express();
const s3 = new AWS.S3(config);

const upload = multer({
storage: multerS3({
  s3,
  bucket: process.env(LIARA_BUCKET_NAME),
  key: function (req, file, cb) {
    console.log(file);
    cb(null, file.originalname);
  },
}),
});


// route
app.post('/upload', upload.single('objectKey'), function (req, res) {
console.log(req.file);

return res.send({
  status: 'success',
  message: 'file uploaded!',
  url: {
    size: req.file.size,
    url: req.file.location,
    name: req.file.key,
    type: req.file.mimetype,
  },
});
});


app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});