Advertisement
Guest User

Ragnar Node Tutorial(ish)

a guest
Feb 24th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // WELCOME TO RAGNARS MAGICAL NODE.JS GUIDE
  2. // For å installere selve node får du google litt selv, jeg kan det kun på Linux.
  3. // Men er er nå iallefall hvordan selve server-filen og stuff virker.
  4.  
  5. // Express er frameworket som du bør bruke. Hva dette betyr er uviktig, bare at du vet hvordan du bruker det.
  6. // Alle ting som er inni require() er moduler som må installeres via NPM
  7. // NPM er package manager. Super-easy, bare skrive "npm install express" for eksempel
  8. // ^ det gjelder iallefall på ubuntu-server, aner faktisk ikke hvordan det gjøres via NTNU sine greier.
  9. // For å lese om de ulike, bare søk på "node express" eller andre moduler osv.
  10. // Husker ikke hvordan jeg installerte selve NPM men var sikkert enkelt det også. Google.
  11. var express = require('express');
  12. var app = express();
  13.  
  14. // Fs er fil-systemet, og eksisterer kun for å lese og skrive filer. (og opprette osv osv)
  15. var fs = require('fs');
  16.  
  17. // mysql2 er den mysql-modulen som jeg synes ser best ut.
  18. // Se https://github.com/brianmario/mysql2, og scroll litt ned, står veldig mye bra om hvordan bruke den, med eksempler
  19. var mysql = require('mysql2');
  20.  
  21. // Er litt usikker på hva denne betyr, men helt til vi/dere bryr oss/dere om sikkerhet, så er det kanskje greit å ha denne
  22. // Kanskje lurt å undersøke litt om anbefalt mappestruktur til node, jeg vet jeg ikke har brydd meg i det hele tatt, og
  23. // det gjør det vanskeligere å begynne å tenke på sikkerhet enn hvis det er grei mappestruktur fra starten av.
  24. // Sikkert en "public"-mappe, og litt sånt, idk
  25. app.use(express.static(__dirname));
  26.  
  27. // Sessions er sånn du (eller front-end? usikker. ikke viktig) husker at en bruker faktisk har logget inn, etter han
  28. // går til ny link og side osv.
  29. // Hva er den der secret? Ingen anelse, burde nok se https://github.com/expressjs/session.
  30. // Men sessions er ikke det første du gjør når du setter opp node-server da, men skal sikkert med i sprint 1, så jeg
  31. // la med eksempel til dette her
  32. var session = require('express-session');
  33. app.use(session( {
  34.     secret: 'keyboard cat'
  35. }));
  36.  
  37. // var bodyParser = require('body-parser');
  38. // app.use(bodyParser.json());
  39. // app.use(bodyParser.urlencoded({ extended: true }));
  40.  
  41. app.get('/', function(req, res) {
  42.     // Dette blir funksjonen for å motta "69.69.42.420/" -URL-en (obviously bytt ut med faktisk IP-adresse, eller domene
  43.     // hvis det er sånn NTNU-greiene funker (tar da mot mysite.com og mysite.com/))
  44.     // Kan både bruke spesifikke strings, som her, eller regular expressions som fanger opp flere patterns.
  45.     // Se en annen app.get nedenfor med regex.
  46.  
  47.     // req er HTTP-requesten, res er den fremtidige responsen du skal svare med. I en POST-request (hvis du ikke vet hva dette
  48.     // er, les litt opp, standard måte å sende data, for eks brukernavn og passord ved login) får du tak i POST-parametere ved
  49.     // å kalle req.body.tingDuVilHaTakI. For eks ved login, req.body.username og req.body.password. Selve navnene username og
  50.     // password blir jo bestemt av de som sender POST-requesten, og må nødvendigvis avtales gruppene mellom.
  51.  
  52.     fs.readFile('public/index.html', function(err, data) {
  53.         // Leser filen som ligger i mappen public og heter index.html
  54.         // Function-en blir kalt så snart lesingen er ferdig. Callback og asynchronous er nøkkelord her, powerful stuff.
  55.         if (err) {
  56.             console.log(err); // konsollen er her terminalen/command-line hvor du kjører node fra.
  57.             res.end('Error reading file');  // bare kjapp måte å vise for web-browser-fyren at det skjedde feil
  58.             return;
  59.         }
  60.         // Her gjør vi det enkelt og bare serverer en klar HTML-fil. See, ingen HTML knowledge required :)
  61.         // data er altså dataen i HTML-filen. res.end er funksjonen som faktisk sender HTTP-responsen tilbake til brukeren,
  62.         // eller til mobilen. Til mobilen vil en naturligvis ikke sende HTML-sider, men ren data i JSON-format, inni
  63.         // i en string.
  64.  
  65.         data = data.toString();
  66.  
  67.         // IGNORER ALT INNI HASHTAGGENE TIL DU HAR LEST APP.POST-EN NOEN HAKK UNDER HER.
  68.         // ###############################################################################
  69.         // Undefined er basically null
  70.         // Vi bytter ut litt data hvis brukeren allerede har logget inn.
  71.         if (req.session.user != undefined) {
  72.             data = data.replace('Log in', 'Log out') // f.eks. bytte ut tekst på login-knapp.
  73.                 .replace('<a href="/login">', '<a href="/logout">'); // og selve linken (HTML (dont worry dette ber vi om))
  74.         }
  75.         // ###############################################################################
  76.         res.end( data );
  77.     });
  78. });
  79.  
  80. // Bare et annet lite eksempel, skjønner sikkert hva som skjer her
  81. // ..med mindre du ikke kan regex. Se regexr.com eller google it. Det som skjer her er at den matcher alle URLs med
  82. // /user/<hva som helst>.
  83. app.get(/\/user\/*/, function(req, res) {
  84.     // Her kan du ENTEN ha et filsystem med brukere, som vil være database-uavhengig, men foreslår sql.
  85.     // Henter ut det som kommer etter / i regex-en (stjernen i regexen)
  86.     var brukernavn = req.url.substring( brukernavn.indexOf( '/user/' ) + 6 );
  87.  
  88.     // Se så lett det er å bruke mysql!   Database er optional å inludere, men gjør det jo lettere da.
  89.     var conn = mysql.createConnection({user: 'Gruppe4344', password: 'PekkaIsLovePekkaIsLife', database: 'PU' });
  90.     var spørring = 'SELECT * FROM Users WHERE Username = ' + brukernavn;
  91.  
  92.     // Jeg liker rowsAsArray, men trenger ikke ha det med. Da blir resultatet på formen:
  93.     // [ [rad1_kolonne1, rad1_kolonne2, rad1_kolonne...], [rad2_kolonne1, rad2_kolonne2, rad2_kolonne...], ...]
  94.     // I denne spørringen vil det jo bare være
  95.     // én rad (fordi brukernavn burde være unikt), så resultatet blir [[kol1, kol2, kol3, ...]], ELLER hvis det ikke finnes en bruker
  96.     // med brukernavnet, blir det [[]] (tror jeg).
  97.     var options = {sql: spørring, rowsAsArray: true};
  98.     conn.query(options, function(err, rows) {
  99.         if (err) { console.log(err); res.end('Error SQLing'); return; }
  100.  
  101.         // python-style if-s, hvis det er undefined (aka null), vil if-en ikke kjøre
  102.         if (rows[0][0]) {
  103.             // lese ny fil
  104.             fs.readFile('public/welcome.html', function(err, data) {
  105.                 if (err) { console.log(err); res.end('Error zasdasd'); return; }
  106.                 data = data.toString();   // sånn vi kan jobbe med den
  107.  
  108.                 // Her er det jeg snakket om, hvor du må bytte litt ut på ting i HTML-en basert på hvilken bruker det
  109.                 // er osv. Her er det vi i website-teamet som forteller dere nøyaktig hva som skal replaces (%username),
  110.                 // og nøyaktig hvilken data vi vil ha det byttet ut med (brukernavn et til brukeren, eller annen data).
  111.                 // Her har vi for eksempel en overskrift i HTML-en hvor det står <h1>Profile of %username</h1>.
  112.                 data = data.replace('%username', brukernavn);
  113.                 res.end(data);
  114.             });
  115.         }
  116.         else { // hvis ingen sql-resultater => ingen bruker med navnet
  117.             // Her kan en gjøre mye forskjellig, vi i website-teamet bestemmer jo hva som skal gjøres.
  118.             // For eksempel sende 404, ha en egen user-not-found-side, bare helt enkelt:
  119.             res.end('Username ' + brukernavn + ' does not exist.');
  120.         }
  121.  
  122.     });
  123. });
  124.  
  125. // POST-request, legg merke til app.post istedenfor .get
  126. app.post('/login', function(req, res) {
  127.     // Her later vi som noen har sendt en HTML-form via POST som inneholder
  128.     // username: <det han skrev inn>, password: <det han skrev inn>
  129.     var brukernavn = req.body.username;
  130.     var passord = req.body.password;
  131.  
  132.     var conn = mysql.createConnection({user: 'Gruppe4344', password: 'PekkaIsLovePekkaIsLife', database: 'PU' });
  133.     var options = {sql: 'SELECT Password FROM Users WHERE Username = ' + brukernavn, rowsAsArray: true};
  134.     conn.query(options, function(err, rows) {
  135.         if (err) { console.log(err); res.end('Error zasdasd'); return; }
  136.  
  137.         if (rows[0][0]) { // vi har et resultat, så brukernavnet finnes
  138.             if (rows[0][0] == passord) { // korrekt passord
  139.                 // Her brukes sessions for å huske brukeren, så han slipper logge inn hver eneste gang.
  140.                 // Kan kalle det hva som helst, user er bare et eksempel
  141.                 req.session.user = brukernavn;
  142.  
  143.                 // Her skjer det litt. Dette er et alternativ til res.end. 301 betyr noe lignende .. et eller annet,
  144.                 // det er iallefall det jeg bruker for å redirecte lolz. Etter å ha satt brukernavn i session-en, sendes
  145.                 // brukeren til index-siden (den øverste app.get()-en). Kan selvfølgelig sende han hvor som helst, men på denne
  146.                 // måten ser du at når session-brukernavnet er satt, vil den if-en som spør om det bli aktivert.
  147.                 res.writeHead(301, {Location: '/'});
  148.             }
  149.         }
  150.     });
  151. });
  152.  
  153. // Bytt gjerne ut 1337 med whatever you want, portnummer.
  154. // Det er disse linjene som faktisk får serveren til å "bry seg", når du fra command-line skriver "node server.js"
  155. // (gitt at du kaller denne filen server.js)
  156. // Hvis folk nå går inn på <ip eller domene>:1337, blir den øverste app.get('/') aktivert.
  157. var server = app.listen(1337, function() {
  158.     var host = server.address().address;
  159.     var port = server.port;
  160.     console.log('Listening on host ' + host + ', port ' + port);
  161. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement