[[oktatas:web:nodejs|< NodeJS]] ====== JSON szerver ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2021, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * 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 } ===== NodeJS programként ===== Telepítsük a json-server csomagot: npm install --save-dev json-server Írjunk egy server.js nevű JavaScript prograot: 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ű NodeJS 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)