পাথ মডিউল কি?
পাথ মডিউল হল Node.js-এর একটি অন্তর্নির্মিত মডিউল যা বিভিন্ন অপারেটিং সিস্টেমে ফাইল পাথ পরিবর্তন ও পরিবর্তন করার জন্য টুল প্রদান করে।
যেহেতু উইন্ডোজ ব্যাকস্ল্যাশ (\) ব্যবহার করে এবং POSIX সিস্টেম (Linux, macOS) ফরওয়ার্ড স্ল্যাশ (/) ব্যবহার করে, তাই পাথ মডিউল আপনাকে ক্রস-প্ল্যাটফর্ম কোড লিখতে সক্ষম করে যা যেকোনো সিস্টেমে সঠিকভাবে কাজ করে।
ক্রস-প্ল্যাটফর্ম পাথ হ্যান্ডলিং
সব অপারেটিং সিস্টেমে কাজ করে
পাথ ম্যানিপুলেশন এবং স্বাভাবিককরণ
রুট পরিবর্তন এবং সমন্বয়
ফাইল এক্সটেনশন নিষ্কাশন
সহজেই ফাইলের ধরন সনাক্ত করুন
পাথ মডিউল ব্যবহার করে
পাথ মডিউলটি Node.js-এর একটি মূল মডিউল, তাই কোন ইনস্টলেশনের প্রয়োজন নেই।
আপনি CommonJS বা ES মডিউল ব্যাকরণ ব্যবহার করে এটি আমদানি করতে পারেন:
CommonJS (Node.js-এ ডিফল্ট)
const path = require('path');
// Destructure specific methods if needed
const { join, resolve, basename } = require('path');
ES Modules (Node.js 14+ with "type": "module" in package.json)
import path from 'path';
// Or import specific methods
import { join, resolve, basename } from 'path';
সর্বোত্তম অনুশীলন:
ES মডিউল ব্যবহার করার সময় ভাল গাছ-কাঁপানো এবং ছোট প্যাকেজ আকারের জন্য, শুধুমাত্র আপনার প্রয়োজনীয় পদ্ধতিগুলি আমদানি করুন।
পাথ মডিউল পদ্ধতি
path.basename()
ইউনিক্স বেসনাম কমান্ডের সমতুল্য, পাথের শেষ অংশ প্রদান করে।
const path = require('path');
// Get filename from a path
const filename = path.basename('/users/docs/file.txt');
console.log(filename); // 'file.txt'
// Get filename without extension
const filenameWithoutExt = path.basename('/users/docs/file.txt', '.txt');
console.log(filenameWithoutExt); // 'file'
__dirname এবং __filename
Node.js , __dirname __filename CommonJS , .
উদাহরণ: CommonJS-এ __dirname এবং __filename ব্যবহার করা
// CommonJS module (e.g., app.js)
const path = require('path');
// Get the directory name of the current module
console.log('Directory name:', __dirname);
// Get the file name of the current module
console.log('File name:', __filename);
// Building paths relative to the current module
const configPath = path.join(__dirname, 'config', 'app-config.json');
console.log('Config file path:', configPath);
// Getting the directory name using path.dirname()
console.log('Directory using path.dirname():', path.dirname(__filename));
উদাহরণ: ES মডিউলে __dirname এবং __filename পাওয়া
// ES Module (e.g., app.mjs or "type": "module" in package.json)
import { fileURLToPath } from 'url';
import { dirname } from 'path';
// Get the current module's URL
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
console.log('ES Module file path:', __filename);
console.log('ES Module directory:', __dirname);
// Example with dynamic imports
async function loadConfig() {
const configPath = new URL('../config/app-config.json', import.meta.url);
const config = await import(configPath, { with: { type: 'json' } });
return config;
}
সর্বোত্তম অনুশীলন:
- CommonJS মডিউলে ফাইল পাথ তৈরি করতে path.join() বা path.resolve() এর সাথে __dirname ব্যবহার করুন
- ES মডিউলগুলির জন্য, সমতুল্য কার্যকারিতা পেতে fileURLToPath এবং dirname সহ import.meta.url ব্যবহার করুন
- path.join() __dirname ,
path.extname()
পথের সম্প্রসারণ প্রদান করে, . চরিত্রের শেষ ঘটনা থেকে স্ট্রিংয়ের শেষ পর্যন্ত।
const path = require('path');
const extension = path.extname('file.txt');
console.log(extension); // '.txt'
console.log(path.extname('index.html')); // '.html'
console.log(path.extname('index.coffee.md')); // '.md'
console.log(path.extname('index.')); // '.'
console.log(path.extname('index')); // ''
console.log(path.extname('.index')); // ''
path.join()
একটি প্ল্যাটফর্ম-নির্দিষ্ট বিভাজক ব্যবহার করে সমস্ত প্রদত্ত পাথ সেগমেন্টগুলিকে একটি বিভাজকের মধ্যে একত্রিত করে, তারপর ফলাফল পাথটিকে স্বাভাবিক করে।
উদাহরণ: বেসিক পাথ কাপলিং
const path = require('path');
// Join path segments
const fullPath = path.join('/users', 'docs', 'file.txt');
console.log(fullPath); // Output depends on OS
// Handle relative paths and navigation
console.log(path.join('/users', '../system', './logs', 'file.txt'));
// Handle multiple slashes
console.log(path.join('users', '//docs', 'file.txt')); // Normalizes slashes
দ্রষ্টব্য:
path.join() + এর সাথে স্ট্রিং সংযোগের চেয়ে পছন্দ করা হয় কারণ এটি বিভিন্ন অপারেটিং সিস্টেমে বিভিন্ন পাথ বিভাজক পরিচালনা করে।
path.resolve()
একটি সম্পূর্ণ পাথে পাথ বা পাথ অংশগুলির একটি ক্রম সমাধান করে, একটি সম্পূর্ণ পথ তৈরি না হওয়া পর্যন্ত ডান থেকে বামে প্রক্রিয়াকরণ করে৷
উদাহরণ: সমাধানের পথ
const path = require('path');
// 1. Resolve relative to current working directory
console.log(path.resolve('file.txt'));
// 2. Resolve with multiple segments
console.log(path.resolve('/users', 'docs', 'file.txt'));
// 3. Right-to-left processing
console.log(path.resolve('/first', '/second', 'third')); // '/second/third'
// 4. Using __dirname for module-relative paths
console.log(path.resolve(__dirname, 'config', 'app.json'));
পরামর্শ:
path.resolve() সাধারণত বর্তমান মডিউলের অবস্থানের সাপেক্ষে পরম পাথ তৈরি করতে __dirname-এর সাথে ব্যবহার করা হয়।
path.parse()
বৈশিষ্ট্য সহ একটি বস্তু প্রদান করে যা পথের গুরুত্বপূর্ণ উপাদানগুলিকে উপস্থাপন করে।
উদাহরণ: একটি ফাইল পাথ পার্সিং
const path = require('path');
// Parse a file path
const pathInfo = path.parse('/users/docs/file.txt');
console.log(pathInfo);
/* Output on Unix/macOS:
{
root: '/',
dir: '/users/docs',
base: 'file.txt',
ext: '.txt',
name: 'file'
}
*/
// Accessing parsed components
console.log('Directory:', pathInfo.dir); // /users/docs
console.log('Filename:', pathInfo.base); // file.txt
console.log('Name only:', pathInfo.name); // file
console.log('Extension:', pathInfo.ext); // .txt
দ্রষ্টব্য:
path.parse() path.format() .
path.format()
একটি বস্তু থেকে পাথ স্ট্রিং ফেরত দেয়, যা path.parse() এর বিপরীত।
উদাহরণ: রুট অবজেক্ট ডিজাইন করা
const path = require('path');
// Method 1: Using dir and base
const pathString1 = path.format({
dir: '/users/docs',
base: 'file.txt'
});
console.log(pathString1); // '/users/docs/file.txt'
// Method 2: Using root, dir, name, and ext
const pathString2 = path.format({
root: '/',
dir: '/users/docs',
name: 'file',
ext: '.txt'
});
console.log(pathString2); // '/users/docs/file.txt'
// Practical example: Modify and reconstruct a path
const parsedPath = path.parse('/users/docs/old-file.txt');
parsedPath.base = 'new-file.md';
const newPath = path.format(parsedPath);
console.log(newPath); // '/users/docs/new-file.md'
দ্রষ্টব্য:
path.format() , dir root , root .
path.normalize()
প্রদত্ত পথকে স্বাভাবিক করে তোলে, .. এবং . অঞ্চলগুলি সমাধান করে এবং অপ্রয়োজনীয় বিভাজকগুলি সরিয়ে দেয়।
উদাহরণ: পথ স্বাভাবিক করা
const path = require('path');
// Resolve relative navigation
console.log(path.normalize('/users/./docs/../data/file.txt')); // '/users/data/file.txt'
// Handle multiple consecutive slashes
console.log(path.normalize('/users//docs////file.txt')); // '/users/docs/file.txt'
// Windows-style paths (automatically handled)
console.log(path.normalize('C:\\users\\docs\\..\\file.txt')); // 'C:\\users\\file.txt'
// Edge cases
console.log(path.normalize('')); // '.'
console.log(path.normalize('.')); // '.'
console.log(path.normalize('..')); // '..'
console.log(path.normalize('/..')); // '/'
নিরাপত্তা নোট:
path.normalize() .. , . .
path.relative()
প্রথম পাথ থেকে দ্বিতীয় পাথে আপেক্ষিক পাথ ফেরত দেয়, অথবা যদি পাথগুলো অভিন্ন হয় তাহলে একটি খালি স্ট্রিং।
উদাহরণ: আপেক্ষিক পথ খোঁজা
const path = require('path');
// Basic relative path
console.log(path.relative('/users/docs/file.txt', '/users/images/photo.jpg'));
// Output: '../../images/photo.jpg'
// Same directory
console.log(path.relative('/users/docs/file1.txt', '/users/docs/file2.txt'));
// Output: 'file2.txt'
// Same file
console.log(path.relative('/users/docs/file.txt', '/users/docs/file.txt'));
// Output: ''
// Different roots (Windows)
console.log(path.relative('C:\\user\\test\\aaa', 'C:\\user\\impl\\bbb'));
// Output: '..\\..\\impl\\bbb'
// Practical example: Creating a relative path for web
const absolutePath = '/var/www/static/images/logo.png';
const webRoot = '/var/www/';
const webPath = path.relative(webRoot, absolutePath).replace(/\\/g, '/');
console.log(webPath); // 'static/images/logo.png'
পরামর্শ:
path.relative() বিশেষভাবে উপযোগী যখন আপনাকে আপনার প্রকল্পের বিভিন্ন অবস্থানের মধ্যে আপেক্ষিক URL বা পোর্টেবল পাথ তৈরি করতে হবে।
path.isAbsolute()
একটি প্রদত্ত পথ একটি পরম পথ কিনা তা নির্ধারণ করে। একটি পরম পথ সর্বদা একই অবস্থানে শেষ হয়, কার্যকারী ডিরেক্টরি নির্বিশেষে।
উদাহরণ: পরম পথ পরীক্ষা করা
const path = require('path');
// POSIX (Unix/Linux/macOS)
console.log(path.isAbsolute('/users/docs')); // true
console.log(path.isAbsolute('users/docs')); // false
// Windows
console.log(path.isAbsolute('C:\\temp')); // true
console.log(path.isAbsolute('temp')); // false
// UNC paths (Windows network paths)
console.log(path.isAbsolute('\\\\server\\share')); // true
// Practical example: Ensure absolute path for config files
function ensureAbsolute(configPath) {
return path.isAbsolute(configPath)
? configPath
: path.resolve(process.cwd(), configPath);
}
console.log(ensureAbsolute('config.json')); // Resolves to absolute path
console.log(ensureAbsolute('/etc/app/config.json')); // Already absolute
দ্রষ্টব্য:
উইন্ডোজে, একটি কোলন দিয়ে শুরু হওয়া পাথগুলিকে একটি কোলন (যেমন 'C:\\') পরম হিসাবে বিবেচনা করা হয়, যেমন UNC পাথগুলি (যেমন '\\\\server\\share')।
পথ বৈশিষ্ট্য
path.sep
একটি প্ল্যাটফর্ম-নির্দিষ্ট পাথ সেগমেন্ট বিভাজক প্রদান করে।
এটি একটি পঠনযোগ্য সম্পত্তি যা বর্তমান অপারেটিং সিস্টেমের জন্য ডিফল্ট পাথ সেগমেন্ট বিভাজক প্রদান করে।
উদাহরণ: পাথ বিভাজকগুলির সাথে কাজ করা
const path = require('path');
// Get the platform-specific separator
console.log(`Path separator: ${JSON.stringify(path.sep)}`); // '\\' on Windows, '/' on POSIX
// Building paths safely across platforms
const parts = ['users', 'docs', 'file.txt'];
const filePath = parts.join(path.sep);
console.log('Built path:', filePath);
// Splitting paths correctly
const pathToSplit = process.platform === 'win32'
? 'C:\\Users\\docs\\file.txt'
: '/users/docs/file.txt';
const pathParts = pathToSplit.split(path.sep);
console.log('Split path:', pathParts);
// Normalizing paths with the correct separator
const normalized = path.normalize(`users${path.sep}docs${path.sep}..${path.sep}file.txt`);
console.log('Normalized path:', normalized);
সর্বোত্তম অনুশীলন:
আপনার Node.js অ্যাপ্লিকেশানগুলিতে ক্রস-প্ল্যাটফর্ম সামঞ্জস্য নিশ্চিত করতে সর্বদা শক্ত পাথ বিভাজকের পরিবর্তে path.sep ব্যবহার করুন।
path.delimiter
একটি প্ল্যাটফর্ম-নির্দিষ্ট পাথ বিভাজক প্রদান করে যা PATH-এর মতো পরিবেশের ভেরিয়েবলে পাথগুলিকে আলাদা করতে ব্যবহৃত হয়।
উদাহরণ: PATH এনভায়রনমেন্ট ভেরিয়েবলের সাথে কাজ করা
const path = require('path');
// Get the platform-specific delimiter
console.log(`Path delimiter: ${JSON.stringify(path.delimiter)}`); // ';' on Windows, ':' on POSIX
// Working with PATH environment variable
function findInPath(executable) {
if (!process.env.PATH) return null;
// Split PATH into directories
const pathDirs = process.env.PATH.split(path.delimiter);
// Check each directory for the executable
for (const dir of pathDirs) {
try {
const fullPath = path.join(dir, executable);
require('fs').accessSync(fullPath, require('fs').constants.X_OK);
return fullPath;
} catch (err) {
// File not found or not executable
continue;
}
}
return null;
}
// Example: Find node executable in PATH
const nodePath = findInPath(process.platform === 'win32' ? 'node.exe' : 'node');
console.log('Node.js path:', nodePath || 'Not found in PATH');
দ্রষ্টব্য:
path.delimiter PATH NODE_PATH .
path.win32
উইন্ডোজ-নির্দিষ্ট পাথ পদ্ধতিতে অ্যাক্সেস প্রদান করে, আপনি যে অপারেটিং সিস্টেমটি চালাচ্ছেন তা নির্বিশেষে আপনাকে উইন্ডোজ-স্টাইল পাথের সাথে কাজ করার অনুমতি দেয়।
উদাহরণ: যেকোনো প্ল্যাটফর্মে উইন্ডোজ পাথের সাথে কাজ করা
const path = require('path');
// Always use Windows-style path handling
const winPath = 'C:\\Users\\user\\Documents\\file.txt';
console.log('Windows basename:', path.win32.basename(winPath));
console.log('Windows dirname:', path.win32.dirname(winPath));
// Normalize Windows paths
console.log('Normalized path:', path.win32.normalize('C:\\\\temp\\\\foo\\..\\bar\\file.txt'));
// Convert between forward and backward slashes
const mixedPath = 'C:/Users/User/Documents//file.txt';
console.log('Normalized mixed slashes:', path.win32.normalize(mixedPath));
// Working with UNC paths
const uncPath = '\\\\server\\share\\folder\\file.txt';
console.log('UNC path components:', path.win32.parse(uncPath));
কেস ব্যবহার করুন:
path.win32 অবজেক্টটি বিশেষভাবে উপযোগী যখন আপনার অ্যাপ্লিকেশনটিকে উইন্ডোজ-স্টাইল পাথ সহ নন-উইন্ডোজ প্ল্যাটফর্মে কাজ করার প্রয়োজন হয় যখন Windows সিস্টেম রেজিস্ট্রি বা কনফিগারেশন ফাইল থেকে পাথ প্রক্রিয়াকরণ করা হয়।
path.posix
সমস্ত প্ল্যাটফর্ম জুড়ে সামঞ্জস্যপূর্ণ প্রিসল্যাশ পাথ হ্যান্ডলিং নিশ্চিত করে, POSIX-সম্মত পাথ পদ্ধতিতে অ্যাক্সেস প্রদান করে।
উদাহরণ: যেকোনো প্ল্যাটফর্মে POSIX পাথের সাথে কাজ করা
const path = require('path');
// Always use POSIX-style path handling
const posixPath = '/home/user/documents/file.txt';
console.log('POSIX basename:', path.posix.basename(posixPath));
console.log('POSIX dirname:', path.posix.dirname(posixPath));
// Normalize POSIX paths
console.log('Normalized path:', path.posix.normalize('/usr/local//bin/../lib/file.txt'));
// Working with relative paths
console.log('Relative path:', path.posix.relative('/data/test/aaa', '/data/impl/bbb'));
// Joining paths with POSIX separators
const urlPath = ['static', 'images', 'logo.png'].join(path.posix.sep);
console.log('URL path:', urlPath); // 'static/images/logo.png'
কেস ব্যবহার করুন:
path.posix অবজেক্টটি বিশেষভাবে উপযোগী যখন ওয়েব অ্যাপ্লিকেশন, কনফিগারেশন ফাইল বা API-এর সাথে কাজ করে যেগুলি POSIX-স্টাইলের পাথগুলি অন্তর্নিহিত অপারেটিং সিস্টেম নির্বিশেষে সামঞ্জস্যপূর্ণ পাথ পরিচালনা নিশ্চিত করতে আশা করে।
সাধারণ ব্যবহারের ক্ষেত্রে এবং সর্বোত্তম অনুশীলন
ব্লক পাথ সঙ্গে কাজ
রক্ষণাবেক্ষণযোগ্য Node.js অ্যাপ্লিকেশন তৈরির জন্য মডিউল পাথ বোঝা এবং কাজ করা গুরুত্বপূর্ণ। বাস্তব-বিশ্বের পরিস্থিতিতে রুট ম্যানিপুলেশনের জন্য এখানে কিছু সাধারণ নিদর্শন এবং সর্বোত্তম অনুশীলন রয়েছে।
উদাহরণ: ব্লক পাথ নির্ধারণ
const path = require('path');
const fs = require('fs/promises');
// Current module's directory and file info
console.log('Module directory:', __dirname);
console.log('Module file path:', __filename);
// Common path patterns
const paths = {
// Configuration files relative to project root
config: path.join(__dirname, '..', 'config', 'app.json'),
// Logs directory (create if doesn't exist)
logs: path.join(__dirname, '..', 'logs'),
// Public assets
public: path.join(__dirname, '..', 'public'),
// Uploads directory with proper permissions
uploads: path.join(__dirname, '..', 'uploads')
};
// Ensure directories exist
async function ensureDirectories() {
try {
await Promise.all([
fs.mkdir(paths.logs, { recursive: true }),
fs.mkdir(paths.public, { recursive: true }),
fs.mkdir(paths.uploads, { recursive: true, mode: 0o755 })
]);
console.log('All directories ready');
} catch (error) {
console.error('Error creating directories:', error);
}
}
// Example: Load configuration
async function loadConfig() {
try {
const configData = await fs.readFile(paths.config, 'utf8');
return JSON.parse(configData);
} catch (error) {
console.error('Error loading config:', error.message);
return {};
}
}
// Example: Log to application log
async function logToFile(message) {
try {
const logFile = path.join(paths.logs, `${new Date().toISOString().split('T')[0]}.log`);
const logMessage = `[${new Date().toISOString()}] ${message}\n`;
await fs.appendFile(logFile, logMessage, 'utf8');
} catch (error) {
console.error('Error writing to log:', error);
}
}
// Initialize and run examples
(async () => {
await ensureDirectories();
const config = await loadConfig();
console.log('Loaded config:', config);
await logToFile('Application started');
})();
ES মডিউল রুট হ্যান্ডলিং
ECMAScript মডিউলগুলিতে (.mjs এক্সটেনশন সহ ফাইল বা যদি "টাইপ": "মডিউল" প্যাকেজ.json এ সেট করা থাকে), __dirname এবং __filename উপলব্ধ নেই। ES মডিউলগুলিতে পাথগুলি কীভাবে পরিচালনা করবেন তা এখানে:
// ES Module (app.mjs or with "type": "module" in package.json)
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { promises as fs } from 'fs';
// Get current module's directory and file path
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Utility function for path resolution in ES modules
function resolvePath(relativePath) {
return new URL(relativePath, import.meta.url).pathname;
}
// Example usage
const configPath = join(__dirname, '..', 'config', 'settings.json');
const assetPath = resolvePath('../assets/logo.png');
// Dynamic imports with paths relative to current module
async function loadModule(modulePath) {
const fullPath = new URL(modulePath, import.meta.url);
return import(fullPath);
}
মূল পয়েন্ট:
- বর্তমান মডিউলের URL পেতে import.meta.url ব্যবহার করুন
- প্রয়োজন হলে URL-কে fileURLToPath() দিয়ে ফাইল পাথে রূপান্তর করুন
- বেস হিসাবে import.meta.url সহ URL কন্সট্রাক্টর ব্যবহার করুন
- ক্রস-প্ল্যাটফর্ম সামঞ্জস্যের জন্য path.join() এবং অন্যান্য পাথ পদ্ধতি ব্যবহার করা চালিয়ে যান
উন্নত পাথ ম্যানিপুলেশন নিদর্শন
বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলিতে পাথগুলির সাথে কাজ করার জন্য এখানে কিছু উন্নত নিদর্শন রয়েছে৷
উদাহরণ: উত্পাদন অ্যাপ্লিকেশনের জন্য রুট অ্যাপ্লিকেশন
const path = require('path');
const fs = require('fs/promises');
const os = require('os');
// Path utility class
class PathUtils {
static get tempDir() {
return path.join(os.tmpdir(), 'myapp');
}
static get userHome() {
return process.env.HOME || process.env.USERPROFILE || os.homedir();
}
static async ensureDirectory(dirPath) {
try {
await fs.mkdir(dirPath, { recursive: true, mode: 0o755 });
return true;
} catch (error) {
if (error.code !== 'EEXIST') throw error;
return false;
}
}
static isSafePath(baseDir, targetPath) {
const normalizedBase = path.resolve(baseDir);
const normalizedTarget = path.resolve(targetPath);
return normalizedTarget.startsWith(normalizedBase);
}
static getUniqueFilename(dir, filename) {
const { name, ext } = path.parse(filename);
let counter = 1;
let candidate = filename;
while (fs.existsSync(path.join(dir, candidate))) {
candidate = `${name} (${counter++})${ext}`;
}
return candidate;
}
}
// Example usage
(async () => {
// Ensure temp directory exists
await PathUtils.ensureDirectory(PathUtils.tempDir);
// Safe file operations
const userUploads = path.join(PathUtils.userHome, 'uploads');
const safePath = path.join(userUploads, 'profile.jpg');
if (PathUtils.isSafePath(userUploads, safePath)) {
console.log('Path is safe for operations');
} else {
console.error('Potential path traversal attack detected!');
}
// Generate unique filename
const uniqueName = PathUtils.getUniqueFilename(
userUploads,
'document.pdf'
);
console.log('Unique filename:', uniqueName);
// Working with file extensions
const filePath = '/users/john/docs/report.pdf';
const fileInfo = {
name: path.basename(filePath, path.extname(filePath)),
ext: path.extname(filePath),
dir: path.dirname(filePath)
};
console.log('File info:', fileInfo);
})();
নিরাপত্তা বিবেচনা
ফাইল পাথের সাথে কাজ করার সময়, নিরাপত্তা সর্বদা একটি শীর্ষ অগ্রাধিকার হওয়া উচিত। এখানে কিছু গুরুত্বপূর্ণ নিরাপত্তা বিবেচনা এবং সর্বোত্তম অনুশীলন রয়েছে:
উদাহরণ: সিকিউর পাথ হ্যান্ডলিং
const path = require('path');
const fs = require('fs').promises;
// 1. Prevent directory traversal attacks
function safeJoin(base, ...paths) {
const targetPath = path.join(base, ...paths);
const normalizedPath = path.normalize(targetPath);
// Ensure the resulting path is still within the base directory
if (!normalizedPath.startsWith(path.resolve(base))) {
throw new Error('Access denied: Path traversal detected');
}
return normalizedPath;
}
// 2. Validate file extensions
const ALLOWED_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.gif']);
function hasValidExtension(filePath) {
const ext = path.extname(filePath).toLowerCase();
return ALLOWED_EXTENSIONS.has(ext);
}
// 3. Safe file operations
async function safeReadFile(baseDir, relativePath) {
const safePath = safeJoin(baseDir, relativePath);
// Additional security checks
if (!hasValidExtension(safePath)) {
throw new Error('Invalid file type');
}
const stats = await fs.stat(safePath);
if (!stats.isFile()) {
throw new Error('Not a file');
}
return fs.readFile(safePath, 'utf8');
}
// Example usage
(async () => {
const UPLOAD_DIR = path.join(process.cwd(), 'uploads');
const userInput = '../../../etc/passwd'; // Malicious input
try {
// This will throw an error due to path traversal attempt
const content = await safeReadFile(UPLOAD_DIR, userInput);
console.log('File content:', content);
} catch (error) {
console.error('Security error:', error.message);
}
})();
নিরাপত্তার সর্বোত্তম অভ্যাস:
- সর্বদা ব্যবহারকারী দ্বারা সরবরাহ করা পাথগুলিকে যাচাই এবং পরিমার্জন করুন৷
- ডিরেক্টরি ট্রাভার্সাল প্রতিরোধ করতে path.normalize() ব্যবহার করুন
- বৈধ ফাইল প্রকার যাচাইকরণ সক্ষম করুন৷
- উপযুক্ত ফাইল অনুমতি সেট করুন
- ন্যূনতম অফার নীতি ব্যবহার করুন
- eslint-plugin-security এর মত একটি সিকিউরিটি লিন্টার ব্যবহার করুন
ক্রস-প্ল্যাটফর্ম উন্নয়ন
ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশনগুলি বিকাশ করার সময়, বিভিন্ন অপারেটিং সিস্টেমের মধ্যে পাথের পার্থক্যগুলি সঠিকভাবে পরিচালনা করা গুরুত্বপূর্ণ।
উদাহরণ: ক্রস-প্ল্যাটফর্ম পাথ ম্যানিপুলেশন
const path = require('path');
// Platform detection
const isWindows = process.platform === 'win32';
const isMac = process.platform === 'darwin';
const isLinux = process.platform === 'linux';
// Platform-specific paths
const appDataDir = isWindows
? path.join(process.env.APPDATA || path.join(process.env.USERPROFILE, 'AppData', 'Roaming'))
: path.join(process.env.HOME || process.env.USERPROFILE, isMac ? 'Library/Application Support' : '.config');
// Application-specific directories
const appName = 'MyApp';
const appDir = path.join(appDataDir, appName);
// Ensure application directory exists
require('fs').mkdirSync(appDir, { recursive: true });
// Platform-specific temporary directory
const tempDir = path.join(require('os').tmpdir(), appName);
// Example: Platform-agnostic path handling
function getConfigPath() {
const configName = 'config.json';
// Development vs production paths
if (process.env.NODE_ENV === 'development') {
return path.join(process.cwd(), 'config', configName);
}
// Production path
return path.join(appDir, configName);
}
console.log('Application directory:', appDir);
console.log('Temporary directory:', tempDir);
console.log('Config file path:', getConfigPath());
ক্রস-প্ল্যাটফর্ম টিপস:
- সর্বদা স্ট্রিং সংযোগের পরিবর্তে path.join() ব্যবহার করুন
- একটি প্ল্যাটফর্ম-নির্দিষ্ট বিভাজক প্রয়োজন হলে path.sep ব্যবহার করুন
- কেস-সংবেদনশীল পার্থক্যগুলি পরিচালনা করুন (উইন্ডোজ কেস-সংবেদনশীল নয়)
- বিভিন্ন প্ল্যাটফর্মে ট্র্যাক দৈর্ঘ্যের সীমাবদ্ধতা সম্পর্কে জানুন
- সমস্ত লক্ষ্য প্ল্যাটফর্মে আপনার অ্যাপ্লিকেশন পরীক্ষা করুন
সারাংশ
Node.js Path - .
এটি অ্যাপ্লিকেশনগুলির একটি সমৃদ্ধ সেট অফার করে যা সাহায্য করে:
পাথ মডিউল ব্যবহার করে, আপনি আরও শক্তিশালী এবং পোর্টেবল কোড লিখতে পারেন যা বিভিন্ন পরিবেশে ফাইল পাথ সঠিকভাবে পরিচালনা করে।
অনুশীলন করুন
সঠিক মডিউল নামটি টেনে আনুন এবং ড্রপ করুন যা ফাইল এবং ডিরেক্টরি পাথগুলির সাথে কাজ করার জন্য ইউটিলিটিগুলি প্রদান করে।
The ______ module.