ITV0110 node.js töö 2017: erinevus redaktsioonide vahel
| 22. rida: | 22. rida: | ||
Igasugused väikesed täiendused on ok ja soovitavad, aga ei anna mingeid lisapunkte. | |||
Igasugused väikesed täiendused on ok ja | |||
node.js sissejuhatust vaata kursuse põhilehel node.js peatükis. | node.js sissejuhatust vaata kursuse põhilehel node.js peatükis. | ||
Redaktsioon: 16. november 2017, kell 00:20

Töö eesmärk
Töö sisuline eesmärk on tutvuda javascripti kasutamisega serveri pool node.js-i süsteemi abil.
Mis tuleb teha
Sinu ülesandeks on node.js abil ehitada hästi lihtne kahe inimese kivi-paber-käärid mäng. Kaks mängijat peavad saama käia kivi/paber/käärid ja kui mõlemad käinud, näidatakse kummalegi, kes võitis ja alustatakse uuesti. Ilusat kujundust ei ole vaja teha, sisselogimist ei ole vaja teha, statistikat jne ei ole vaja kuvada. CSS-i ja brauseripoolset javascripti pole vaja.
Üks lihtne variant ehitamiseks on selline, kus veebileht end vastase käiku oodates kord sekundis refreshib ja seisu hoitakse lihtsalt failis ühe json-i reana:
- server kuvab algul veebilehe, kus saad sisestada nimeväljale oma nime ja vajuta ühte nuppu kolmest: kivi, paber, käärid. Kui vajutad, saadab serverile a la ?name=tanel&move=kivi
- serveril on üks seisufail, kuhu ta kirjutab ühe või kahe inimese käiku.
- kui server saab päringu a la ?name=tanel&move=kivi, siis on kolm varianti:
- seisufail on tühi: server salvestab seisufaili {"tanel":"kivi"} ja annab tagasi htmli, mis ütleb "oota" ja refreshib sekundi järel, saates serverile päringu a la ?state=waiting
- seisufailis on juba käik a la {"jaan":"paber"}. Siis server salvestab seisufailiks {"jaan":"paber","tanel":"kivi"} ja annab vastuseks info, kes võitis ja uue käigu tegemise vormi.
- seisufailis on juba kaks käiku a la {"jaan":"paber","tanel":"kivi"}: siis tuleb alustada uut mängu ehk server kirjutab selle faili üle uue ühe-käigu sisuga {"tanel":"kivi"}
- kui server saab brauserilt ootan-käiku päringu a la ?state=waiting siis kui:
- seisufailis on kaks käiku a la {"jaan":"paber","tanel":"kivi"} siis ta annab vastuseks info, kes võitis ja uue käigu tegemise vormi.
- seisufail on tühi või on seal ainult üks nimi: annab tagasi htmli, mis ütleb "oota" ja refreshib sekundi järel päringuga a la ?state=waiting
Igasugused väikesed täiendused on ok ja soovitavad, aga ei anna mingeid lisapunkte.
node.js sissejuhatust vaata kursuse põhilehel node.js peatükis.
node.js-i arenduse saad teha nii dijkstras kui ka üleni oma arvutis (installeeri endale node.js) või arvutiklassi arvutis (seal on ta olemas arvutiklassi standardpakettide hulgas, ei ole vaja olla admin). Lõpptulemusena tuleb rakendus igal juhul dijkstra-sse käima panna.
node.js Dijkstras
Dijkstras saad käivitada node.js-i nii:
nodejs &
Kus ampersand & ütleb opsüsteemile, et see programm tuleb käima jätta. ehk koos programmiga
nodejs myprog.js &
Vaata, kas nodejs server töötab:
ps
ja kui jah, siis sa näed midagi sellist:
PID TTY TIME CMD 29728 pts/2 00:00:00 bash 30162 pts/2 00:00:00 nodejs 30288 pts/2 00:00:00 ps
nodejs serveri peatamiseks ütle siis
kill 30162
ja kui see ei mõju, ütle kõvemini (niisama kill saadab leebe signaali a la sure ise maha, aga kill -9 tapab iga protsessi jõuga maha):
kill -9 30162
kus 30162 on protsessi number PID, mida ps sulle nodejs kohta ütles.
Portidena, kust datat servereerida, saad kasutada vahemikku 7300-8000. NB! Kui mõni port on hetkel kellegi poolt juba kasutuses, siis teine programm seda samal ajal kasutada ei saa.
Näiteks selline nodejs-i programm töötab serveris ok: pane käima (vbl pead enne pordi muutma) ja ava http://dijkstra.cs.ttu.ee:7500/
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World taneli poolt\n');
}).listen(7500, '193.40.252.80');
console.log('Server running at http://193.40.252.80/');
Näited
Järgnevas on väikesed node näited, mida sobib kasutada praksiga alustamiseks.
localhost tähendab alati sellesama masina ip-d, kus ise hetkel oled. Kui sa brauserist avad http://localhost/... siis see töötab ok ainult juhul, kui server (meil siis nodejs all jooksev proge) on samas masinas, kus brauser. Kui sa paned nodejs-ga oma proge dijkstrast käima, pead avama muidugi http://dijkstra.css.ttu.ee/... (ja port tuleb ka lisada igal juhul, kui su server ei käi vaikimisi 80 pordis).
Kui oled nodejs oma arvutis käima saanud, käivita programmid käsurealt nii (dijkstras ütle node asemel nodejs, lisa lõppu ampersand ja pordid vali vahemikust 7300-8000):
node myprog.js
ja ava urlilt näiteks nii http://localhost:1337 või nii http://localhost:1337/suva/proov?b=c&d=f123555&a=456
Näited kuvavad debuginfot konsoolile ja näitavad tulemusi brauserisse.
Hello world:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World taneli poolt\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
Failist lugemine:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var fs = require('fs');
var show="File contents:<p> "
fs.readFile('katse.txt',"utf8", function (err, data) {
if (err) {
console.log(err);
res.write("viga failist lugemisel");
res.end();
return;
}
console.log(data);
show+=data;
res.write(show);
res.end();
});
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
Urli parsimine (katseta http://localhost:1337/suva/proov?b=c&d=f123555&a=456 )
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var fs = require('fs');
var url = require('url');
fs.readFile('katse.txt',"utf8", function (err, data) {
if (err) {
console.log(err);
res.write("viga failist lugemisel");
res.end();
return;
}
var show="Url:<p> "
var url_parts = url.parse(req.url, true);
show+=JSON.stringify(url_parts);
show+="<p>File contents:<p> "
show+=data;
res.write(show);
res.end();
});
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
Faili kirjutamine:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var fs = require('fs');
var url = require('url');
fs.readFile('katse.txt',"utf8", function (err, data) {
if (err) {
console.log(err);
res.write("viga failist lugemisel");
res.end();
return;
}
var show="Url:<p> "
var url_parts = url.parse(req.url, true);
show+=JSON.stringify(url_parts);
show+="<p>File contents:<p> "
show+=data;
var store="some text";
fs.writeFile('store.txt',store, function (err) {
if (err) {
console.log(err);
res.write("viga faili kirjutamisel");
res.end();
return;
}
res.write(show);
res.end();
});
});
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
Kirjutatud failist lugemine ja ühe näiteparameeter a kuvamine ( katseta http://localhost:1337/suva/proov?b=c&d=f123555&a=456 )
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var fs = require('fs');
var url = require('url');
fs.readFile('katse.txt',"utf8", function (err, data) {
if (err) {
console.log(err);
res.write("viga katsefailist lugemisel");
res.end();
return;
}
fs.readFile('store.txt',"utf8", function (err, storedata) {
if (err) {
console.log(err);
res.write("viga storefailist lugemisel");
res.end();
return;
}
var show="Url:<p> "
var url_parts = url.parse(req.url, true);
show+=JSON.stringify(url_parts);
show+="<p>Template file contents:<p> "
show+=data;
show+="<p>Store file contents:<p> "
show+=storedata;
parsed_store=JSON.parse(storedata);
if (parsed_store.a) {
show+="<p>Store file param a value:<p> "
show+=parsed_store.a;
}
var store=JSON.stringify(url_parts.query);
show+="<p>Stored:</p>";
show+=store;
fs.writeFile('store.txt',store, function (err) {
if (err) {
console.log(err);
res.write("viga faili kirjutamisel");
res.end();
return;
}
res.write(show);
res.end();
});
});
});
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');