Mitenkäs NodeJs:ssä saa PHP-haasteen parametrejä luettua? Parametrejä ei saa haettua querysta, niinkuin tavallisesti:
// POST https://nodejsosoite.com?sana=moi app.post('/', (request, response) => { request.query['sana'] // moi });
Olen nyt tehnyt PHP -haasteen 60 ensimmäistä tehtävää pienellä purkkaviritelmällä.
Minulla on toisessa osoitteessa php -tiedosto:
<?php $sana = $_REQUEST["sana"]; $url = "https://nodejsosoite.com?sana=$sana"; $answer = file_get_contents($url); echo $answer; ?>
Ja haen sanan sitten näin:
app.get('/', (request, response) => { request.query['sana']; });
Kuten ohjeissa kerrotaan, PHP-haaste lähettää muuttujat POST-tietona eli samalla tavalla kuin HTML-lomake <form method="POST">
. Tästä varmasti löytyy netistä monta esimerkkiä, mutta näyttää olevan Node.js:llä hieman mutkia matkassa, joten en lähde itse arvailemaan parasta tai vakiintunutta tapaa.
Kokeilin monia netistä löytyviä esimerkkejä tuloksetta. Voisiko olla, että PHP ei viesti oikein Node.js:n kanssa? No eipä tuolla väliä, jatkan samalla viritelmällä.
AtskaFin kirjoitti:
Kokeilin monia netistä löytyviä esimerkkejä tuloksetta. Voisiko olla, että PHP ei viesti oikein Node.js:n kanssa?
Mitä ihmettä tämä nyt tarkoittaa? Palvelimesi vastaanottaa ihan standardeja HTTP-pyyntöjä eikä mitään "PHP-viestejä".
En nyt töiden lomassa lähde koodailemaan muiden ongelmia, mutta kyllä tämä Node.js:n ja PHP:n yhteen sovittaminen on varmasti yksi yleisimpiä netissä käsiteltyjä Node-ongelmia, joten vastauksen löytämisen on oltava triviaalia.
Metabolix kirjoitti:
Tästä varmasti löytyy netistä monta esimerkkiä, mutta näyttää olevan Node.js:llä hieman mutkia matkassa, joten en lähde itse arvailemaan parasta tai vakiintunutta tapaa.
Ehkä PHP-haasteen kontekstissa näin, mutta PHP se vasta heitteleekin mutkia matkalle omalla sekavalla tavallaan parsia HTTP-pyyntöjen runko-osa. Node.js:ssä sen sijaan ei ole mitään erikoistapauksia vaan kehittäjä voi periaatteessa itse valita, miten käsittelee minkäkin tyyppistä sisältöä.
The Alchemist kirjoitti:
PHP se vasta heitteleekin mutkia matkalle omalla sekavalla tavallaan parsia HTTP-pyyntöjen runko-osa.
Näin toki tavallaan on. Toisaalta kuitenkin selaimessa perinteinen ja edelleen tavallinen tapa tiedon lähettämiseen on lomake ja MIME-tyyppi application/x-www-form-urlencoded, joten mielestäni on hieman hassua, että tämän purkamiseen vaaditaan joko erillinen moduuli tai oma koodi, joka kerää datan puskuriin ja lopuksi purkaa. Eli vaikka vaihtoehtoja on nykyään paljon, odottaisin erityisesti tähän tilanteeseen valmista yhden rivin ratkaisua.
AtskaFin kirjoitti:
Voisiko olla, että PHP ei viesti oikein Node.js:n kanssa?
Ei voi olla. Harjoituksena voit tehdä koodin, jossa toimii tavallinen HTML-lomake POST-metodilla. Kun se toimii, myös PHP-haaste toimii.
Tässä on nyt oletettavasti PHP-haasteeseen sopiva Node.js-koodi, joka purkaa tavallisen lomakedatan (application/x-www-form-urlencoded).
const http = require('http'); const querystring = require('querystring'); const server = http.createServer((request, response) => { let body = ''; request.on('data', data => { body += data; }); request.on('end', () => { let $_REQUEST = querystring.parse(body); // Debug: näytetään purettu data JSON-muodossa. response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(JSON.stringify($_REQUEST)); }); }); server.listen(8080, '::');
Koodi näyttää toimivan odotetusti, koska PHP-haaste ilmoittaa esimerkiksi seuraavaa:
Syöte (URL-muoto) maara=2&yhteys=A<->B Syöte (PHP-muoto) $_REQUEST = array ( 'maara' => '2', 'yhteys' => 'A<->B', ); Oma vastauksesi {"maara":"2","yhteys":"A<->B","id":"81"}
body-parser sisälsi tarvittavan toimenpiteen:
const app = require('express')(); const bodyParser = require('body-parser'); // tämä parsii parametrit bodyyn, joka sijoitetaan requestiin. app.use(bodyParser.urlencoded({ extended: true })); app.post('/', (req, res) => { const a = Number(req.body.a); const b = Number(req.body.b); res.send(a + b + ''); }); const PORT = 3001; app.listen(PORT, () => { console.log(`app running on port ${ PORT }`); });
Olisi varmaan ollut viisasta kertoa aloituksessa, että käytän expressiä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.