[[oktatas:web:nodejs|< Node.js]]
====== JSON szerver ======
* **Szerző:** Sallai András
* Copyright (c) 2021, Sallai András
* Szerkesztve: 2024
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== A json-server =====
A json-server JSON fájlokat szolgál ki, amelyek írását is lehetővé teszi.
Létrehozható routing tábla, képes kiszolgálni statikus HTML oldalakat.
===== Indulás =====
A json-server-t használhatjuk globálisan telepítve, vagy lokálisan a projektbe telepítve.
Globális használathoz telepítés:
npm install --global json-server
Globálisan ellenőrzés:
json-server
Helyben, a projektbe telepítve:
npm init -y
npm install --save-dev json-server
Helyben ellenőrzés:
npx json-server
===== Mintaadat =====
{
"employees": [
{
"id": 1,
"fullname": "Nagy János",
"city": "Szolnok",
"salary": 8400000
},
{
"id": 2,
"fullname": "Páros Lajos",
"city": "Szeged",
"salary": 3430000
},
{
"id": 3,
"fullname": "Aranyos Enikő",
"city": "Szolnok",
"salary": 4245000
}
]
}
===== Szerverindítás =====
json-server --watch employees.json --port 8000
Ellenőrzés:
curl localhost:8000/employees/2/
Portbeállítás:
* -p --port
===== Beállítások =====
A beállításokat egy **json-server.json** fájlba írjuk.
Például:
{
"port": 8000
}
===== Node.js programként =====
Telepítsük a json-server csomagot:
npm install --save-dev json-server
Írjunk egy server.js nevű JavaScript programot:
const json_server = require('json-server')
const server = json_server.create()
const router = json_server.router('db.json')
const middlewares = json_server.defaults()
server.use(middlewares)
server.use(router)
server.listen(3000, () => {
console.log('JSON Szerver fut')
})
===== Tesztelés axios csomaggal =====
Az axios csomaggal írhatunk egyszerű Node.js programokat, amelyek műveleteket hajtanak
végre a json-server-en.
Az axios telepítése:
npm install --save-dev axios
==== GET kérés ====
const axios = require('axios');
axios.get('http://localhost:3000/dolgozok')
.then(resp => {
dolgozok = resp.data;
dolgozok.forEach(dolgozo => {
console.log(`${dolgozo.fullname}`);
});
})
.catch(error => {
console.log(error);
});
node get_employees.js
==== PUT kérés ====
const axios = require('axios');
axios.post('http://localhost:3000/dolgozok', {
id: 4,
"fullname": "Bárány Tamás",
"city": "Miskolc",
"salary": 2850000
}).then(resp => {
console.log(resp.data);
}).catch(error => {
console.log(error);
});
Ellenőrzés:
curl localhost:3000/dolgozok/4/
==== PUT ====
Módosítás PUT kéréssel.
const axios = require('axios');
axios.put('http://localhost:3000/dolgozok/4/', {
"fullname": "Kék Tamás",
"city": "Miskolc",
"salary": 2850000
}).then(resp => {
console.log(resp.data);
}).catch(error => {
console.log(error);
});
cat dolgozok.json
==== DELETE kérés ====
const axios = require('axios');
axios.delete('http://localhost:3000/dolgozok/3/', {
}).then(resp => {
console.log(resp.data);
}).catch(error => {
console.log(error);
});
cat dolgozok.json
===== Rendezés =====
curl localhost:3000/dolgozok?_sort=fullname&_order=asc
===== Műveletek =====
3 millió forintnál nagyobb fizetésű dolgozok:
curl localhost:3000/dolgozok?salary_gte=3000000
Operátorok lehetnek:
* gte
* lte
===== Keresés =====
curl localhost:3000/dolgozok?q=Lajos
===== JSON fájl =====
{
"employees": [
{
"id": 1,
"fullname": "Nagy János",
"city": "Szolnok",
"salary": 8400000
},
{
"id": 2,
"fullname": "Páros Lajos",
"city": "Szeged",
"salary": 3430000
},
{
"id": 3,
"fullname": "Aranyos Enikő",
"city": "Szolnok",
"salary": 4245000
}
],
"assignment": [
{
"id": 1,
"name": "tesztelő"
},
{
"id": 2,
"name": "mérnök"
}
]
}
===== Azonosítás tokennel =====
A json-server alapértelmezetten nem tud azonosítást. Ebben a fejezetben egy
token kérését követeljük meg egy végponthoz.
A klienstől ezt várjuk a fejrészben:
Authorization: Bearer aaaa
A következő json-server egy Bearer tokent vár, amit négy darab "a" betű,
de csak a /dolgozok végpont esetén.
const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()
server.use(middlewares)
server.use((req, res, next) => {
if(req.url == "/dolgozok") {
if (isAuthorized(req)) {
next() // continue to JSON Server router
} else {
res.sendStatus(401)
}
}else {
next()
}
})
server.use(router)
server.listen(3000, () => {
console.log('JSON Server is running')
})
function isAuthorized(req) {
if(req.headers.authorization === undefined) {
return
}
let token = req.headers.authorization.split(" ")[1];
if (token === "aaaa") {
return true;
}else {
return false;
}
}
Teszt a curl klienssel:
curl -GET -H "Content-Type: application/json" -H "Authorization: Bearer: aaaa" "http://localhost:3000/dolgozok"
Felhasznált webhely:
* https://github.com/typicode/json-server#access-control-example (2023)
===== Linkek =====
Források:
* https://zetcode.com/javascript/jsonserver/ (2021)
* https://www.npmjs.com/package/json-server (2021)
* https://github.com/typicode/json-server (2021)
HTTP:
* https://github.com/typicode/json-server/issues/389#issuecomment-733615060 (2021)
Middleware:
* [[https://github.com/Apress/pro-angular-9/blob/master/07%20-%20SportsStore/Beginning%20of%20Chapter/SportsStore/authMiddleware.js|https://github.com]] (2022)