Hyrje
PostgreSQL (shkurtuar si Postgres) është një nga bazat e të dhënave më të përdorura në ndërtimin e aplikacioneve softuerike. Postgres është një sistem i përgjithshëm, me burim të hapur, objekt-relational database management system (RDBMS). Një nga avantazhet e përdorimit të Postgres është mbështetja për të dy relational (SQL) dhe jo-relational (NoSQL) querying.
Një mënyrë për të lidhur një bazë të dhënash me një aplikacion web është përmes përdorimit të një ORM (Object Relational Mapper). Një ORM vepron si një shtresë e komunikimit midis aplikacionit tuaj dhe bazës së të dhënave. Qëllimi i këtij tutorial është për të shpjeguar se si ju mund të përdorni Postgres në aplikacionin tuaj Express përmes Sequelize ORM.
Sequelize ORM përshkruhet si:
Një TypeScript modern dhe Node.js ORM për Oracle, Postgres, MySQL, MariaDB, SQLite dhe SQL Server, dhe më shumë.
Një TypeScript modern dhe Node.js ORM për Oracle, Postgres, MySQL, MariaDB, SQLite dhe SQL Server, dhe më shumë.
Ju do të ndërtoni një API të thjeshtë të menaxhimit të detyrave. API do të jetë në gjendje të krijojë, të listojë, të përditësojë statusin e përfundimit dhe të fshijë detyrat.
Ky tutorial është i pari në një seri të ardhshme të tutorialeve të përqendruara në përdorimin e bazave të të dhënave relacionale në Express duke përdorur Sequelize.
Parashikimet
Për të vazhduar me këtë tutorial, ju do të duhet:
- Një redaktor i tekstit (p.sh. VS Code)
- Një klient API për testimin e pikave të fundit (p.sh. Postman)
- Node.js është instaluar në kompjuterin tuaj
- Njohuritë themelore të Express
- Një instancë e Postgres që funksionon ose lokalisht ose në distancë
Projekti i instalimit
Ne do të fillojmë me vendosjen e skedarëve dhe directories përshtatshme për krijimin e një aplikacioni Express dhe instalimin e paketave të nevojshme.
-
Create the project directory:
mkdir tasks-manager-api
-
Navigate to the project directory:
cd tasks-manager-api
-
Initialize the NPM package by running the following command to create a
package.json
file with default settings:npm init -y
-
Install Express and other core dependencies:
npm install express express-async-errors dotenv && npm install nodemon --save-dev
-
Install Postgres driver for Node.js:
npm install pg
-
Install Sequelize:
npm install sequelize
-
In the root directory, create the
models
andutils
folders:mkdir models utils
-
In the root directory, create a
.env
file, which will contain the server’s port number and the database URL of any Postgres instance:PORT=5000 DATABASE_URL=postgres://<user>:<password>@<host>:<port>/<database>
-
In the root directory, create the
index.js
file, which is the application entry point:touch index.js
-
Set up the command to run the local development server by editing the
scripts
object inpackage.json
:{ //… "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "nodemon index.js", "start": "node index.js" }, //… }
Struktura e dosjes së projektit duhet të duket kështu:
Konfigurimi i sekuencës
Krijoni dy skedarë nëutils
Drejtorë :config.js
dhedb.js.
Variablat e mjedisit të ngarkesës
Në tëconfig.js
Llogaritni variablat e mjedisit nga.env
dosjet duke përdorurdotenv
paketa. pastaj të eksportojëPORT
dheDATABASE_URL
variablat në mënyrë që ato të mund të arrihen në pjesë të tjera të aplikacionit.
tëconfig.js
Dosja duhet të ketë përmbajtjen e mëposhtme:
require('dotenv').config()
const PORT = process.env.PORT || 3000
const DATABASE_URL = process.env.DATABASE_URL
module.exports = {
PORT,
DATABASE_URL
}
Krijimi i një sequelize instance
Në tëdb.js
file, krijoni një instancë Sequelize. Mund të krijoni një instancë Sequelize duke kaluar URI-në e lidhjes së bazës së të dhënave (e ruajtur nëDATABASE_URL
) në Sequelize constructor. Pastaj krijoni një funksionconnectToDB,
që do të testojë lidhjen me bazën e të dhënave duke thirrurauthenticate
Përfundimisht, ju mund të eksportoniconnectToDB
Funksioni dhe instanca e sekuestrimit.
tëutils/db.js
Dosja duhet të ketë përmbajtjen e mëposhtme:
const Sequelize = require("sequelize");
const { DATABASE_URL } = require("./config");
const sequelize = new Sequelize(DATABASE_URL)
const connectToDB = async () => {
try {
await sequelize.authenticate()
console.log("Database connection established successfully.")
} catch (error) {
console.log("Unable to connect to the database:", error)
return process.exit(1)
}
return null
}
module.exports = {
connectToDB,
sequelize
}
Përcaktimi i modelit të detyrës
Një model sequelize është një përfaqësim i një tabele në bazën e të dhënave.Task
model duke zgjeruar sequelizeModel
klasë dhe të thërrasëModel.init(attributes, options)
funksioneve të
Në tëmodels
drejtues, të krijojëtask.js
Faqe me përmbajtjen e mëposhtme:
const {Model, DataTypes} = require("sequelize")
const {sequelize} = require("../utils/db")
class Task extends Model {}
Task.init({
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
title: {
type: DataTypes.STRING,
allowNull: false
},
completed: {
type: DataTypes.BOOLEAN,
defaultValue: false
}
}, {
sequelize,
modelName: "Task",
timestamps: true,
underscored: true,
defaultScope: {
attributes: {
exclude: ["createdAt", "updatedAt"]
}
}
})
Task.sync()
module.exports = Task
tëattributes
Parametri përcakton strukturën eTask
Tabela në bazën e të dhënave:Task
Modeli ka tre atribute:
- id: Një fushë e numrit të plotë që është një çelës primar automatikisht rritës i përdorur për të identifikuar në mënyrë unike çdo rekord.
- Titulli: Një fushë string që përfaqëson emrin e detyrës.
- përfunduar: Fusha e përfunduar ka një vlerë Boolean që tregon nëse detyra është kryer.
tëoptions
parametra konfiguron se si Sequelize trajton modelin.Task
Modeli ka opsionet e mëposhtme:
- sequelize: Instanca e Sequelize e krijuar më parë në utils/db.js.
- modelName: Emri i tabelës së krijuar në bazën e të dhënave.
- Timestamps: Kur vendoset në True, shton fushat e krijuaraNë dhe të përditësuarNë automatikisht në model.
- nënvizuar: Kur vendoset në True , konverton fushat Camel Case në rastin e gjarprit në bazën e të dhënave.
- defaultScope: Përjashton atribute të caktuara sipas parazgjedhjes gjatë pyetjes.
tëTask.sync()
Funksioni sinkronizon modelin me bazën e të dhënave duke krijuar tabelën nëse tabela nuk ekziston.
Krijimi i Express Server
Së fundi, ju i vendosni të gjitha së bashku duke krijuar serverin Express.index.js
file, ju vendosni middleware e nevojshme, përcaktoni API Endpoint Routes, dhe ekzekutoni Express Server.
tëstart
Funksioni është përgjegjës për inicializimin e serverit Express.start
Funksioni i parë teston lidhjen me bazën e të dhënave duke thirrurconnectToDB()
Nëse lidhja është e suksesshme, fillon serveri Express, i cili dëgjon në portin e specifikuar.
tëindex.js
Dosja ka përmbajtjen e mëposhtme:
require("express-async-errors");
const express = require("express");
const app = express();
const { PORT } = require("./utils/config");
const { connectToDB } = require("./utils/db");
const Task = require("./models/task");
// middlewares
app.use(express.json());
// routes
app.get("/api/tasks", async (req, res) => {
const tasks = await Task.findAll();
res.json({
message: "List of tasks",
tasks: tasks,
});
});
app.post("/api/tasks", async (req, res) => {
const { title } = req.body;
const task = await Task.create({ title });
res.status(201).json({
message: "Task created successfully",
task,
});
});
app.patch("/api/tasks/:id/toggle-completed", async (req, res) => {
const { id } = req.params;
const task = await Task.findByPk(id);
if (!task) {
return res.status(404).json({ message: "Task not found" });
}
task.completed = !task.completed;
await task.save();
res.json({
message: task.completed
? "Task marked as completed"
: "Task marked as not completed",
task,
});
});
app.delete("/api/tasks/:id", async (req, res) => {
const { id } = req.params;
const task = await Task.findByPk(id);
if (!task) {
return res.status(404).json({ message: "Task not found" });
}
await task.destroy();
res.json({
message: "Task deleted successfully",
});
});
const start = async () => {
try {
await connectToDB();
app.listen(PORT, console.log(`Server is running on port ${PORT}`));
} catch (error) {
console.error(error);
process.exit(1);
}
};
start();
Përdorimi i API Endpoint
Ju tani mund të vazhdoni për të testuar API Endpoints:
- Krijo një detyrë të re—POST /api/tasks:
- Lista e të gjitha detyrave—GET /api/tasks:
- Toggle statusin e përfundimit—PATCH /api/tasks/:id/toggle-e përfunduar:
- Fshij një detyrë—DELETE /api/task:
Konkludimi
Tani ju e dini se si të lidhni një aplikacion Express me një bazë të dhënash Postgres duke përdorur Sequelize. Ju keni ndërtuar një API të thjeshtë të menaxherit të detyrave, dhe në proces, ju keni konfiguruar Sequelize, lidhur Sequelize me një instancë Postgres,Task
Krijimi dhe përdorimi i API Endpoints
Aktualisht, logjika e kontrolluesit është shkruar nëindex.js
Në tutorialet e ardhshme, ne do ta rifaktorizojmë këtë bazë kodesh në një strukturë më të shkallëzueshme duke përdorur kontrolluesit, routerët dhe migracionet Sequelize.
Për të lexuar më tej, ju duhet të kaloni nëpërDokumentacioni i shpejtëpër të mësuar më shumë rreth pyetjeve të modelit, validimeve, asociacioneve dhe më shumë.
Ju mund të gjeni kodin burim të plotë për këtë tutorial nëGithub.
Burimet
- Përshkrimi i dokumentit (v6)
- Çfarë është PostgreSQL?
- Përdorimi i bazave të të dhënave relacionale me Sequelize – FullStackOpen
- Dokumentacioni Express.js