Node.js — pg moduli, connection pool, CRUD
PostgreSQL ni Node.js dan ishlatish uchun pg moduli — eng mashhur va keng tarqalgan kutubxona.
O'rnatish
npm install pg
Ulanish — Pool
const { Pool } = require('pg');
const pool = new Pool({
host: process.env.DB_HOST || 'localhost',
port: process.env.DB_PORT || 5432,
database: process.env.DB_NAME || 'myapp',
user: process.env.DB_USER || 'postgres',
password: process.env.DB_PASSWORD || 'parol',
max: 20, // maksimal ulanishlar
idleTimeoutMillis: 30_000, // bo'sh ulanish yopilish vaqti
connectionTimeoutMillis: 2000, // ulanish kutish vaqti
});
module.exports = pool;
.env faylida:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp
DB_USER=api_user
DB_PASSWORD=kuchli_parol
SELECT — ma'lumot olish
const pool = require('./db');
// Barcha foydalanuvchilar
async function barcha() {
const { rows } = await pool.query('SELECT * FROM foydalanuvchilar');
return rows;
}
// ID bo'yicha — parameterized query (SQL Injection yo'q)
async function bittasiId(id) {
const { rows } = await pool.query(
'SELECT * FROM foydalanuvchilar WHERE id = $1',
[id]
);
return rows[0] || null;
}
// Filtrlash
async function faollar() {
const { rows } = await pool.query(
'SELECT id, ism, email FROM foydalanuvchilar WHERE faol = $1 ORDER BY ism',
[true]
);
return rows;
}
INSERT — qo'shish
async function yaratish(ism, email, parol_hash) {
const { rows } = await pool.query(
`INSERT INTO foydalanuvchilar (ism, email, parol_hash)
VALUES ($1, $2, $3)
RETURNING id, ism, email, yaratilgan`,
[ism, email, parol_hash]
);
return rows[0]; // yangi yaratilgan foydalanuvchi
}
UPDATE — yangilash
async function yangilash(id, ism, email) {
const { rows, rowCount } = await pool.query(
`UPDATE foydalanuvchilar
SET ism = $2, email = $3, yangilangan = NOW()
WHERE id = $1
RETURNING *`,
[id, ism, email]
);
if (rowCount === 0) throw new Error('Topilmadi');
return rows[0];
}
DELETE — o'chirish
async function o_chirish(id) {
const { rowCount } = await pool.query(
'DELETE FROM foydalanuvchilar WHERE id = $1',
[id]
);
return rowCount > 0; // true = o'chirildi, false = topilmadi
}
Xatolarni boshqarish
async function bittasiEmail(email) {
try {
const { rows } = await pool.query(
'SELECT * FROM foydalanuvchilar WHERE email = $1',
[email]
);
return rows[0] || null;
} catch (err) {
// Ulanish xatosi, so'rov xatosi
console.error('DB xato:', err.message);
throw err;
}
}
Express bilan to'liq misol
const express = require('express');
const pool = require('./db');
const app = express();
app.use(express.json());
// GET /users
app.get('/users', async (req, res) => {
try {
const { rows } = await pool.query(
'SELECT id, ism, email FROM foydalanuvchilar ORDER BY id'
);
res.json(rows);
} catch (err) {
res.status(500).json({ xato: err.message });
}
});
// POST /users
app.post('/users', async (req, res) => {
const { ism, email } = req.body;
try {
const { rows } = await pool.query(
'INSERT INTO foydalanuvchilar (ism, email) VALUES ($1, $2) RETURNING *',
[ism, email]
);
res.status(201).json(rows[0]);
} catch (err) {
if (err.code === '23505') { // unique violation
res.status(409).json({ xato: 'Bu email allaqachon mavjud' });
} else {
res.status(500).json({ xato: err.message });
}
}
});
Xulosa
const { Pool } = require('pg');
const pool = new Pool({ /* sozlamalar */ });
// So'rov
const { rows, rowCount } = await pool.query(SQL, [param1, param2]);
// Parametrlar: $1, $2, $3 ... — SQL Injection yo'q
// rows — natija massivi
// rowCount — ta'sirlangan qatorlar soni
// rows[0] — birinchi natija
// Xatolar
// err.code = '23505' — unique violation
// err.code = '23503' — foreign key violation
// err.code = '23502' — not null violation
Keyingi dars
63-dars: Node.js — Transaction, xatolarni boshqarish