দুই পাঠ আগের REST API একটি সাধারণ অ্যারেতে পণ্য সংরক্ষণ করে — এমন ডেটা যা সার্ভার রিস্টার্ট হওয়া মাত্রই উধাও হয়ে যায়। একটি বাস্তব অ্যাপ্লিকেশন এর বদলে একটি ডেটাবেসে ডেটা সংরক্ষণ করে, যাতে এটি রিস্টার্টের পরও টিকে থাকে আর একসাথে অনেক রিকোয়েস্ট জুড়ে নিরাপদে শেয়ার করা যায়।
Node.js-এ কোনো বিল্ট-ইন ডেটাবেস সাপোর্ট নেই — একটির সাথে সংযুক্ত হতে সেই নির্দিষ্ট ডেটাবেসের জন্য লেখা একটি npm প্যাকেজ প্রয়োজন। কয়েকটি সাধারণ প্যাকেজ:
| ডেটাবেস | সাধারণ ড্রাইভার প্যাকেজ |
|---|---|
| PostgreSQL | pg |
| MySQL | mysql2 |
| SQLite | better-sqlite3 |
নিচের উদাহরণগুলো PostgreSQL-এর জন্য pg ব্যবহার করে — প্যাটার্নটি (সংযুক্ত হওয়া, তারপর placeholder দিয়ে কোয়েরি করা) অন্যগুলোর সাথে প্রায় একই রকম দেখায়, শুধু ভিন্ন একটি প্যাকেজ নামে।
const { Pool } = require('pg')
const pool = new Pool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
})লক্ষ্য করুন প্রতিটি মান একটি হার্ডকোড করা স্ট্রিং থেকে নয়, process.env থেকে আসে — ঠিক এনভায়রনমেন্ট ভেরিয়েবল নিয়ে আগের পাঠের প্যাটার্ন। একটি ডেটাবেস পাসওয়ার্ড ঠিক সেই ধরনের সিক্রেট যা কখনো সরাসরি একটি সোর্স ফাইলে থাকা উচিত নয়।
প্রতিটি কোয়েরি মেথড একটি promise ফেরত দেয়, তাই এটি স্বাভাবিকভাবে async/await-এর সাথে খাপ খায়:
app.get('/products', async (req, res) => {
try {
const result = await pool.query('SELECT * FROM products')
res.json(result.rows)
} catch (err) {
console.error(err)
res.status(500).json({ error: 'Database query failed' })
}
})একটি রিকোয়েস্ট থেকে আসা মান কখনো সরাসরি একটি কোয়েরি স্ট্রিং-এ ঢোকানো উচিত নয়:
// কখনো এটি করবেন না
const id = req.params.id
await pool.query(`SELECT * FROM products WHERE id = ${id}`)একজন ভিজিটর যে একটি সংখ্যার বদলে একটি সাজানো id মান পাঠায় সে এটি ব্যবহার করে ডেটাবেসের বিরুদ্ধে যেকোনো SQL চালাতে পারে — একটি SQL injection আক্রমণ। এর বদলে একটি placeholder ব্যবহার করুন, আর মানটি একটি আলাদা প্যারামিটার হিসেবে পাস করুন:
const id = req.params.id
const result = await pool.query('SELECT * FROM products WHERE id = $1', [id])ড্রাইভারটি মানটি নিরাপদে escape করা সামলায় — এই একটি অভ্যাসই একটি সাধারণ কোয়েরি আর একটি exploitable কোয়েরির মধ্যে পার্থক্য তৈরি করে।
যেখানে SQL সিনট্যাক্স নিজেই শেখানো হয়
এই পাঠটি শুধু Node-কে ইতিমধ্যে বিদ্যমান একটি ডেটাবেসের সাথে সংযুক্ত করা কভার করে। SQL নিজেই লেখা — SELECT, WHERE, join, আর একটি কোয়েরির বাকি সবকিছু — এই সাইটের SQL কোর্সে সম্পূর্ণভাবে কভার করা হয়েছে।