Įvadas
PostgreSQL (sutrumpinta kaip Postgres) yra viena iš dažniausiai naudojamų duomenų bazių kuriant programinės įrangos programas. Postgres yra bendrojo tikslo, atviro kodo, objektinio ryšio duomenų bazių valdymo sistema (RDBMS). Vienas iš naudos iš Postgres privalumų yra jo palaikymas tiek reliacinių (SQL) ir ne-reliacinių (NoSQL) užklausų.
Vienas iš būdų prijungti duomenų bazę prie žiniatinklio programos yra naudojant ORM (Object Relational Mapper). ORM veikia kaip komunikacijos sluoksnis tarp jūsų paraiškos ir duomenų bazės.Šio vadovėlio tikslas yra paaiškinti, kaip galite naudoti Postgres savo Express programoje per Sequelize ORM.
Sequelize ORM apibūdinamas kaip:
Šiuolaikinis „TypeScript“ ir „Node.js“ ORM „Oracle“, „Postgres“, „MySQL“, „MariaDB“, „SQLite“ ir „SQL Server“ ir kt.
Šiuolaikinis „TypeScript“ ir „Node.js“ ORM „Oracle“, „Postgres“, „MySQL“, „MariaDB“, „SQLite“ ir „SQL Server“ ir kt.
Jūs sukursite paprastą užduočių valdymo API. API galės kurti, sąrašą, atnaujinti užbaigimo būseną ir ištrinti užduotis.
Šis vadovas yra pirmasis iš būsimos serijos vadovėlių, orientuotų į ryšių duomenų bazių naudojimą "Express" naudojant "Sequelize".
Išankstinės sąlygos
Norėdami tęsti šią pamoką, jums reikės:
- Teksto redaktorius (pvz., VS kodas)
- API klientas, skirtas išbandyti galinius taškus (pvz., Pašto darbuotojas)
- Node.js yra įdiegta jūsų kompiuteryje
- Pagrindinės ekspreso žinios
- „Postgres“ atvejis, veikiantis vietoje arba nuotoliniu būdu
Projekto įkūrimas
Mes pradėsime nustatydami atitinkamus failus ir katalogus, kad sukurtume „Express“ programą ir įdiegtume reikiamus paketus.
-
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" }, //… }
Projekto aplanko struktūra turėtų atrodyti taip:
Konfigūracija Sequelize
Sukurkite du failus įutils
Direktorių :config.js
irdb.js.
Įkrovimo aplinkos kintamieji
įconfig.js
failą, įkelkite aplinkos kintamuosius iš.env
Failas naudojantdotenv
pakuotės. Tada eksportuotiPORT
irDATABASE_URL
kintamieji, kad juos būtų galima pasiekti kitose programos dalyse.
Tųconfig.js
Failas turi turėti tokį turinį:
require('dotenv').config()
const PORT = process.env.PORT || 3000
const DATABASE_URL = process.env.DATABASE_URL
module.exports = {
PORT,
DATABASE_URL
}
Sukurkite Sequelize Instance
įdb.js
failą, sukurkite Sequelize instance. Galite sukurti Sequelize instance perduodami duomenų bazės ryšio URI (saugomąDATABASE_URL
) į Sequelize constructor. Tada sukuriate funkcijąconnectToDB,
bus išbandytas ryšys su duomenų baze, paskambinusauthenticate
funkcija. galiausiai, jūs eksportuojateconnectToDB
funkcijos ir sekvestracijos instancijos.
Tųutils/db.js
Failas turi turėti tokį turinį:
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
}
Apibrėžti užduočių modelį
„Sequelize“ modelis yra lentelės pateikimas duomenų bazėje.Task
modelis pratęsdamas SequelizeModel
Klasė ir skambinimasModel.init(attributes, options)
ir funkcijos.
įmodels
direktorius, sukurkitetask.js
Failas su tokiu turiniu:
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
Parametrai apibrėžia struktūrąTask
Duomenų bazės lentelė.ltTask
Modelis turi tris atributus:
- id: Visų skaičių laukas, kuris yra automatiškai didinamas pirminis raktas, naudojamas unikaliai identifikuoti kiekvieną įrašą.
- pavadinimas: eilutės laukas, kuris atstovauja užduoties pavadinimą.
- užbaigtas: užbaigtas laukas turi Boolio reikšmę, kuri rodo, ar užduotis buvo atlikta.
Tųoptions
parametras nustato, kaip „Sequelize“ tvarko modelį.Task
Modelis turi šias galimybes:
- Sequelize: Sequelize instancija, sukurta anksčiau Utils/db.js.
- modelName: lentelės, sukurtos duomenų bazėje, pavadinimas.
- Laiko žymės: Kai nustatoma „True“, į modelį automatiškai įtraukiami laukai „CreatedAt“ ir „UpdatedAt“.
- Pabrėžiama: Nustatytas į true , konvertuoja camel Case laukus į gyvatės atvejį duomenų bazėje.
- defaultScope: Išskiria tam tikrus atributus pagal numatytuosius nustatymus, kai užklausos.
TųTask.sync()
funkcija sinchronizuoja modelį su duomenų baze, sukurdama lentelę, jei lentelės neegzistuoja.
Ekspreso serverio kūrimas
Galiausiai, jūs viską sujungėte, sukurdami "Express" serverį.index.js
failą, įdiegiate reikiamą tarpinę programinę įrangą, apibrėžiate API galinių taškų maršrutus ir paleiskite ekspresinį serverį.
Tųstart
funkcija yra atsakinga už „Express“ serverio inicijavimą.start
funkcija pirmiausia išbandys ryšį su duomenų baze, paskambindamaconnectToDB()
Jei ryšys yra sėkmingas, jis paleidžia „Express“ serverį, kuris klausosi nurodyto uosto.
Tųindex.js
Failas turi tokį turinį:
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();
API Endpoint naudojimas
Dabar galite pradėti išbandyti API galinius taškus:
- Sukurkite naują užduotį — POST /api/tasks:
- Sąrašas visų užduočių — GET /api/tasks:
- Perkelkite užbaigimo būseną —PATCH /api/tasks/:id/toggle-užbaigtas:
- Ištrinti užduotį – Ištrinti /api/task:
Išvada
Dabar žinote, kaip prijungti „Express“ programą prie „Postgres“ duomenų bazės naudojant „Sequelize“. Jūs sukūrėte paprastą užduočių valdytojo API, o proceso metu konfigūruojate „Sequelize“, prijungėte „Sequelize“ prie „Postgres“ instituto, apibrėžėteTask
Pavyzdžiui, jie sukūrė API galinius taškus.
Šiuo metu kontrolieriaus logika yra parašytaindex.js
Artimiausiuose vadovėliuose, mes iš naujo sukursime šią kodo bazę į labiau skalbiamą struktūrą, naudojant valdiklius, maršrutizatorius ir Sequelize migracijas.
Norėdami skaityti toliau, turėtumėte eiti perSequelizuoti dokumentacijąsužinoti daugiau apie modelių užklausas, patvirtinimus, asociacijas ir dar daugiau.
Galite rasti visą šio vadovėlio šaltinio kodą„GitHub“.
išteklių
- Dokumentų rinkimas (v6)
- Kas yra PostgreSQL?
- Ryšių duomenų bazių naudojimas su „Sequelize“ – „FullStackOpen“
- „Express.js“ dokumentacija