Json-server en egyedi útkezelő miért nem működik?
Ez a leírás szerint csinálom csak én POST kérést akarok mert adatokat akarok postolni és kiírni fájlba de ezt csak a szerver oldalon tehetem meg amihez egy egyedi handler kellene ami ezt a post kérést kezeli . Mert nem a json fájlba akarom visszaírni az adatokat hanem pont hogy onnan akarom kiszedni és fájlba írni.
A leírás szerint csak get kérésre van példa de a robot állítja hogy post ra is működnie kell . Még sem működik , 404 a kérés címe nem található.
Lehet egyáltalán post kérést küldeni így vagy félre vagyok már megint vezetve?
A fejlécben is mint fájlnév van megadva az útcím ami a /archiv de ez nem létezik mert én csak mint fantom hoztam létre ezt a címet azért hogy erre az útra érkezzen a post kérés mert ebben a függvényben írnám ki fájlba az adatokat.
Böngésző F12:
POST
scheme http
host localhost:3000
filename /archiv
(Aszinkron: EventHandlerNonNull)
Ez a szerveroldali js ben lévő egyedi útkezelő ami annyiban tér el a githubos példától hogy nem get hanem post. Robottal ezerszer köbefutottuk és elvileg működnie kell.
server1.post('/archiv', (req, res) => {
fs.writeFile('output.json', req.body, (err) => {
if (err) {
console.log(err);
res.status(500).send('Hiba történt a fájl írása közben.');
} else {
res.status(200).send('Az adatok sikeresen ki lettek írva a fájlba.');
}
});
})
A linkelt doksiban ezt írja:
// To handle POST, PUT and PATCH you need to use a body-parser
// You can use the one used by JSON Server
server.use(jsonServer.bodyParser)
server.use((req, res, next) => {
if (req.method === 'POST') {
req.body.createdAt = Date.now()
}
// Continue to JSON Server router
next()
})
Igen használva van a server.use(jsonServer.bodyParser) . Az utána lévő kódnak a robot szerint semmi köze az egyedi handleremhez az csak valami dátumot ad hozzá a post kéréshez.
Miért szerinted mire kell ez a createdAt ?
A kódban amit bemásoltál nem látszott, hogy használod a server.use(jsonServer.bodyParser)-t
Szerintem próbáld ki, hogy amit idemásoltam kód, abban ezt:
req.body.createdAt = Date.now()
cseréled erre:
fs.writeFile('output.json', req.body, (err) => {
if (err) {
console.log(err);
res.status(500).send('Hiba történt a fájl írása közben.');
} else {
res.status(200).send('Az adatok sikeresen ki lettek írva a fájlba.');
}
});
De ennél okosabbat sajna nem tudok mondani
Ez nem lesz jó mert nem az a célom hogy minden post kérésnél kiírja fájlba az adott postot hanem hogy egy /archiv útra küldött post nál írja ki az adatokat. Ezt pedig a /archiv handler callback függvényében kell végrehatjanom .
De nagyon úgy néz ki hogy csak get elni lehet úgyhogy ki kell talalálnom valami mást hogyan lehet json adatokat fájlba írni böngésző eseményre.
Működnie kellene peddig.
Kimásoltam ezt a példát: [link]
Hozzáadtam ezt a kódot:
server.post('/action', (req, res) => {
res.jsonp("Hi")
});
Futtatom: node test.js
Lekérés:
$ curl -X POST localhost:3000/action 2>/dev/null | jq
"Hi"
Szóval ennek mennie kell. Hogy néz ki a teljes fileod?
Én 0.17.3 verzióval próbáltam, a legfrissebb alpha verzió az hibás és nem is működik
Működik az egyedi útkezelő a böngésző felé , küldi a get kéréseket.
Nem ez a probléma hanem hogy a szerver oldalon a (req, res) => függvényben lévő dolgokat nem hajtja végre .
Mert a robot szerint itt tudnám elsütni a fájlírást meg a törlést meg fetch kéréseket is a node-fetch modullal .
Muszáj itt csinálnom mivel a kliens oldali js ben nem engedélyezett a fájlírás modul .
A robotnak semmi ötlete nincs az alábbi kódban miért nem hajtódik végre a req res függvény ,még a console.log sem működik.
A robot végig express modulról beszél ,én meg json servert használok de szerintem a json serverben is express van .
const jsonServer = require("json-server");
const cors = require("cors");
const path = require("path");
const fs = require('fs');
const fetch = require('node-fetch');
// Első szerver létrehozása a 3000 es porton
const server1 = jsonServer.create();
const middlewares1 = jsonServer.defaults();
server1.use(cors());
server1.use(jsonServer.bodyParser);
server1.use(middlewares1);
server1.get('/archiv', (req, res) => {
fs.writeFile('output.json', JSON.stringify({ test: 'test' }), (err) => {
if (err) {
console.log(err);
res.status(500).send('Hiba történt a fájl írása közben.');
} else {
res.status(200).send('Az adatok sikeresen ki lettek írva a fájlba.');
}
});
});
Ja itt már az írónak egy test objektum lett megadva hogy tovább szűkítsük a hibakört de így sem jött létre a fájl.
És lemaradt a folytatása a js nek .
const router1 = jsonServer.router(path.join(__dirname, "db1.json"));
server1.use(router1);
server1.listen(3000, () => {
console.log("Server is running at http://localhost:3000");
})
Átírtam magamnak is:
server.get("/archiv", (req, res) => {
fs.writeFile("output.json", JSON.stringify({ test: "test" }), (err) => {
if (err) {
console.log(err);
res.status(500).send("Hiba történt a fájl írása közben.");
} else {
res.status(200).send("Az adatok sikeresen ki lettek írva a fájlba.");
}
});
});
És megy:
$ curl localhost:3000/archiv 2>/dev/null
Az adatok sikeresen ki lettek írva a fájlba.
Nem tudom miért get kérésel csináltad, de post kéréssel is ugyanúgy megy:
server.use(jsonServer.bodyParser);
server.post("/archiv", (req, res) => {
fs.writeFile("output.json", JSON.stringify(req.body), (err) => {
if (err) {
console.log(err);
res.status(500).send("Hiba történt a fájl írása közben.");
} else {
res.status(200).send("Az adatok sikeresen ki lettek írva a fájlba.");
}
});
});
$ curl -X POST -d '{"hello":1}' -H 'Content-Type: application/json' localhost:3000/archiv 2>/dev/null
Az adatok sikeresen ki lettek írva a fájlba.
És az output.json fájl tartalma:
{"hello":1}
Nem igazán látok benne hibát. Itt a teljes kód: [link]
Tegnap már csináltam külön egy express servert ,és kipróbáltam az express beimportálásával is de akkor is ugyan ez a helyzet , a kérés átmegy de a callback függvény nem fut le . Majd még próbálkozok.
Te ezt tisztán express serveren csináltad vagy közösen json-servert is tartalmazó js fájlban?
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!