1. Home
  2. Nodejs Boilerplate
  3. প্রজেক্ট তৈরী ও কনফিগ করা
  4. প্রজেক্ট তৈরী করা

প্রজেক্ট তৈরী করা

এখানে একটি Node.js প্রজেক্ট তৈরি করবো যেখানে Joi দিয়ে পরিবেশ ভেরিয়েবল (environment variables) এবং ইনপুট ডেটার ভ্যালিডেশন কিভাবে করতে হয় তা দেখানো হবে। এই প্রজেক্টে আমরা .env ফাইল থেকে কনফিগারেশন লোড করবো এবং Joi দিয়ে সেগুলোর ভ্যালিডেশন করবো। চলুন শুরু করা যাক!

ধাপ ১: প্রজেক্ট সেটআপ করা

১.১ নতুন ফোল্ডার তৈরি ও Node.js ইনিশিয়ালাইজ করা

mkdir my-joi-validation-project
cd my-joi-validation-project
npm init -y

এই কমান্ডগুলো চালিয়ে নতুন প্রজেক্টের জন্য একটি ফোল্ডার তৈরি করছি এবং npm init -y কমান্ডটি দিয়ে ডিফল্ট package.json ফাইল তৈরি করা হচ্ছে।

১.২ প্রয়োজনীয় প্যাকেজ ইনস্টল করা

npm install dotenv joi express helmet compression cors
  • express: মূল Express.js ফ্রেমওয়ার্ক।
  • dotenv: .env ফাইল থেকে পরিবেশগত ভেরিয়েবল লোড করতে ব্যবহৃত হয়।
  • joi: ইনপুট ডেটা ভ্যালিডেশনের জন্য।
  • helmet: বিভিন্ন HTTP নিরাপত্তা হেডার সেট করতে ব্যবহৃত হয়।
  • compression: গিজিপ কম্প্রেশন যোগ করতে।
  • cors: Cross-Origin Resource Sharing (CORS) কনফিগার করতে ব্যবহৃত হয়।

ধাপ ২: .env ফাইল তৈরি করা

প্রজেক্টের রুট ডিরেক্টরিতে .env নামক একটি ফাইল তৈরি করুন এবং এতে কনফিগারেশন ভেরিয়েবল যোগ করুন। যেমন:

.env

NODE_ENV=development
PORT=3000
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USERNAME=root
MYSQL_PASSWORD=rootpassword
MYSQL_DATABASE=mydatabase
JWT_SECRET=mysecretkey
JWT_ACCESS_EXPIRATION=30

এখানে আমরা বিভিন্ন সেটিংস যেমন NODE_ENV, PORT, ডাটাবেস সংক্রান্ত তথ্য এবং JWT সিক্রেট কী সেট করছি।

ধাপ ৩: প্রজেক্টের ফোল্ডার স্ট্রাকচার তৈরি করা

প্রজেক্টের জন্য একটি সাধারণ ফোল্ডার স্ট্রাকচার নিম্নরূপ হতে পারে:

my-joi-validation-project/

├── config/
   └── config.js        # কনফিগারেশন এবং ভ্যালিডেশন ফাইল
├── .env                 # পরিবেশ ভেরিয়েবল
├── package.json         # প্রজেক্ট ডিটেইলস
└── server.js            # প্রধান এপ্লিকেশন ফাইল

ধাপ ৪: কনফিগারেশন ও ভ্যালিডেশন যুক্ত করা (config.js)

config/config.js

const path = require("path");
const dotenv = require("dotenv");
const Joi = require("joi");

// .env ফাইল থেকে ভেরিয়েবল লোড করা
dotenv.config({ path: path.join(__dirname, "../.env") });

// Joi স্কিমা তৈরি করে পরিবেশ ভেরিয়েবল যাচাই করা
const envVarsSchema = Joi.object()
  .keys({
    NODE_ENV: Joi.string().valid("production", "development", "test").required(),
    PORT: Joi.number().default(3000),
    MYSQL_HOST: Joi.string().required().description("MySQL host"),
    MYSQL_PORT: Joi.number().default(3306),
    MYSQL_USERNAME: Joi.string().required().description("MySQL username"),
    MYSQL_PASSWORD: Joi.string().required().description("MySQL password"),
    MYSQL_DATABASE: Joi.string().required().description("MySQL database name"),
    JWT_SECRET: Joi.string().required().description("JWT secret key"),
    JWT_ACCESS_EXPIRATION: Joi.number()
      .default(30)
      .description("minutes after which access tokens expire"),
  })
  .unknown();

// যাচাই করা ও ত্রুটি চেক করা
const { value: envVars, error } = envVarsSchema
  .prefs({ errors: { label: "key" } })
  .validate(process.env);

if (error) {
  throw new Error(`Config validation error: ${error.message}`);
}

// যাচাইকৃত ভেরিয়েবল এক্সপোর্ট করা
module.exports = {
  env: envVars.NODE_ENV,
  port: envVars.PORT,
  mysql: {
    host: envVars.MYSQL_HOST,
    port: envVars.MYSQL_PORT,
    username: envVars.MYSQL_USERNAME,
    password: envVars.MYSQL_PASSWORD,
    database: envVars.MYSQL_DATABASE,
  },
  jwt: {
    secret: envVars.JWT_SECRET,
    tokenLife: envVars.JWT_ACCESS_EXPIRATION,
  },
};

১. প্রয়োজনীয় প্যাকেজগুলো ইমপোর্ট করা

const path = require("path");
const dotenv = require("dotenv");
const Joi = require("joi");
  • path: এটি Node.js এর বিল্ট-ইন মডিউল যা ফাইল এবং ডিরেক্টরির পথ পরিচালনা করে।
  • dotenv: এটি .env ফাইল থেকে পরিবেশ ভেরিয়েবল লোড করে process.env এ সংরক্ষণ করে।
  • Joi: এটি ডাটা ভেলিডেশন ল্যাব্রেরি, যা কনফিগারেশন বা ইনপুট যাচাই করার জন্য ব্যবহার হয়।

২. পরিবেশ ভেরিয়েবল লোড করা

dotenv.config({ path: path.join(__dirname, "../../.env") });
  • .env ফাইলটি প্রকল্পের মূল ডিরেক্টরি থেকে লোড করা হয় যেখানে পরিবেশ ভেরিয়েবল সংরক্ষণ করা হয়।
  • path.join(__dirname, "../../.env") দিয়ে .env ফাইলের সঠিক অবস্থান নির্ধারণ করা হয়েছে।

৩. ভেরিয়েবল স্কিমা (Schema) তৈরি করা

const envVarsSchema = Joi.object()
  .keys({
    NODE_ENV: Joi.string()
      .valid("production", "development", "test")
      .required(),
    PORT: Joi.number().default(3000),
    MYSQL_HOST: Joi.string().required().description("MySQL host"),
    MYSQL_PORT: Joi.number().default(3306),
    MYSQL_USERNAME: Joi.string().required().description("MySQL username"),
    MYSQL_PASSWORD: Joi.string().required().description("MySQL password"),
    MYSQL_DATABASE: Joi.string().required().description("MySQL database name"),
    JWT_SECRET: Joi.string().required().description("JWT secret key"),
    JWT_ACCESS_EXPIRATION: Joi.number()
      .default(30)
      .description("minutes after which access tokens expire"),
  })
  .unknown();

  • envVarsSchema একটি স্কিমা তৈরি করা হয়েছে যা Joi.object() ব্যবহার করে করা হয়েছে। এখানে প্রত্যেকটি কনফিগারেশন ভেরিয়েবলের জন্য শর্ত দেওয়া হয়েছে।
  • NODE_ENV: প্রজেক্টের পরিবেশ সেট করা হয়, যেমন production, development, বা test
  • PORT: অ্যাপ্লিকেশনের চলমান পোর্ট। ডিফল্ট মান ৩০০০।
  • MYSQL_*: ডাটাবেস সংক্রান্ত তথ্য যেমন হোস্ট, পোর্ট, ইউজারনেম, পাসওয়ার্ড এবং ডাটাবেস নাম।
  • JWT_SECRET: JWT-এর জন্য সিক্রেট কী, যা টোকেন এনক্রিপ্ট করার জন্য ব্যবহৃত হয়।
  • JWT_ACCESS_EXPIRATION: এক্সেস টোকেন কত মিনিট পরে মেয়াদ শেষ হবে তা নির্ধারণ করা হয় (ডিফল্ট ৩০ মিনিট)।

যাচাই ও ত্রুটি হ্যান্ডলিং

const { value: envVars, error } = envVarsSchema
  .prefs({ errors: { label: "key" } })
  .validate(process.env);

if (error) {
  throw new Error(`Config validation error: ${error.message}`);
}

এখানে validate(process.env) দিয়ে process.env এর ডাটা যাচাই করা হচ্ছে। যদি কোনো ভেরিয়েবল মিসিং থাকে বা ভুল হয়, তবে error এ ত্রুটির বার্তা সঞ্চিত হবে।

যদি error থাকে তবে throw new Error দিয়ে পুরো প্রজেক্ট বন্ধ করা হয় এবং ত্রুটির বার্তা দেখানো হয়।

কনফিগারেশন এক্সপোর্ট করা

module.exports = {
  env: envVars.NODE_ENV,
  port: envVars.PORT,

  mysql: {
    host: envVars.MYSQL_HOST,
    port: envVars.MYSQL_PORT,
    username: envVars.MYSQL_USERNAME,
    password: envVars.MYSQL_PASSWORD,
    database: envVars.MYSQL_DATABASE,
  },
  jwt: {
    secret: envVars.JWT_SECRET,
    tokenLife: envVars.JWT_ACCESS_EXPIRATION,
  },
};
  • module.exports এর মাধ্যমে যাচাই করা পরিবেশ ভেরিয়েবলগুলোকে অ্যাপ্লিকেশন এর অন্যান্য অংশে ব্যবহারের জন্য প্রেরণ করা হয়েছে।
  • env, port, mysql এবং jwt সেটিংস অ্যাপ্লিকেশন এর যে কোনো জায়গায় সহজে অ্যাক্সেসযোগ্য।

এইভাবে কোডটি কনফিগারেশন ভেরিয়েবলগুলোর যাচাই এবং লোড পরিচালনা করে যা Node.js প্রজেক্টের নিরাপত্তা এবং স্থিতিশীলতার জন্য সহায়ক।

ধাপ ৫ : app.js ফাইল তৈরি করা

app.js

const express = require("express");
const helmet = require("helmet");
const compression = require("compression");
const cors = require("cors");

const app = express();

// নিরাপত্তা হেডার সেট করতে helmet ব্যবহার করা
app.use(helmet());

// JSON রিকোয়েস্ট বডি পার্স করা
app.use(express.json());

// URL-encoded ডেটা পার্স করা
app.use(express.urlencoded({ extended: true }));

// গিজিপ কম্প্রেশন অ্যাক্টিভ করা
app.use(compression());

// CORS সক্রিয় করা
app.use(cors());
app.options("*", cors());

module.exports = app;

ধাপ ৬ : মেইন সার্ভার ফাইল তৈরি করা (server.js)

server.js

const app = require("./app");
const config = require("./config/config");

// সার্ভার চালু করা
app.listen(config.port, () => {
  console.log(`Server is running on port ${config.port}`);
});

ধাপ ৬: প্রজেক্ট চালানো

এখন প্রজেক্ট চালু করার জন্য নিচের কমান্ডটি রান করুন:

node server.js

এবার আপনি ব্রাউজারে গিয়ে http://localhost:3000 এ অ্যাক্সেস করতে পারেন এবং দেখবেন Hello World! Joi Validation is working. মেসেজটি দেখাবে।

How can we help?