Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // WELCOME TO RAGNARS MAGICAL NODE.JS GUIDE
- // For å installere selve node får du google litt selv, jeg kan det kun på Linux.
- // Men er er nå iallefall hvordan selve server-filen og stuff virker.
- // Express er frameworket som du bør bruke. Hva dette betyr er uviktig, bare at du vet hvordan du bruker det.
- // Alle ting som er inni require() er moduler som må installeres via NPM
- // NPM er package manager. Super-easy, bare skrive "npm install express" for eksempel
- // ^ det gjelder iallefall på ubuntu-server, aner faktisk ikke hvordan det gjøres via NTNU sine greier.
- // For å lese om de ulike, bare søk på "node express" eller andre moduler osv.
- // Husker ikke hvordan jeg installerte selve NPM men var sikkert enkelt det også. Google.
- var express = require('express');
- var app = express();
- // Fs er fil-systemet, og eksisterer kun for å lese og skrive filer. (og opprette osv osv)
- var fs = require('fs');
- // mysql2 er den mysql-modulen som jeg synes ser best ut.
- // Se https://github.com/brianmario/mysql2, og scroll litt ned, står veldig mye bra om hvordan bruke den, med eksempler
- var mysql = require('mysql2');
- // Er litt usikker på hva denne betyr, men helt til vi/dere bryr oss/dere om sikkerhet, så er det kanskje greit å ha denne
- // Kanskje lurt å undersøke litt om anbefalt mappestruktur til node, jeg vet jeg ikke har brydd meg i det hele tatt, og
- // det gjør det vanskeligere å begynne å tenke på sikkerhet enn hvis det er grei mappestruktur fra starten av.
- // Sikkert en "public"-mappe, og litt sånt, idk
- app.use(express.static(__dirname));
- // Sessions er sånn du (eller front-end? usikker. ikke viktig) husker at en bruker faktisk har logget inn, etter han
- // går til ny link og side osv.
- // Hva er den der secret? Ingen anelse, burde nok se https://github.com/expressjs/session.
- // 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
- // la med eksempel til dette her
- var session = require('express-session');
- app.use(session( {
- secret: 'keyboard cat'
- }));
- // var bodyParser = require('body-parser');
- // app.use(bodyParser.json());
- // app.use(bodyParser.urlencoded({ extended: true }));
- app.get('/', function(req, res) {
- // Dette blir funksjonen for å motta "69.69.42.420/" -URL-en (obviously bytt ut med faktisk IP-adresse, eller domene
- // hvis det er sånn NTNU-greiene funker (tar da mot mysite.com og mysite.com/))
- // Kan både bruke spesifikke strings, som her, eller regular expressions som fanger opp flere patterns.
- // Se en annen app.get nedenfor med regex.
- // req er HTTP-requesten, res er den fremtidige responsen du skal svare med. I en POST-request (hvis du ikke vet hva dette
- // er, les litt opp, standard måte å sende data, for eks brukernavn og passord ved login) får du tak i POST-parametere ved
- // å kalle req.body.tingDuVilHaTakI. For eks ved login, req.body.username og req.body.password. Selve navnene username og
- // password blir jo bestemt av de som sender POST-requesten, og må nødvendigvis avtales gruppene mellom.
- fs.readFile('public/index.html', function(err, data) {
- // Leser filen som ligger i mappen public og heter index.html
- // Function-en blir kalt så snart lesingen er ferdig. Callback og asynchronous er nøkkelord her, powerful stuff.
- if (err) {
- console.log(err); // konsollen er her terminalen/command-line hvor du kjører node fra.
- res.end('Error reading file'); // bare kjapp måte å vise for web-browser-fyren at det skjedde feil
- return;
- }
- // Her gjør vi det enkelt og bare serverer en klar HTML-fil. See, ingen HTML knowledge required :)
- // data er altså dataen i HTML-filen. res.end er funksjonen som faktisk sender HTTP-responsen tilbake til brukeren,
- // eller til mobilen. Til mobilen vil en naturligvis ikke sende HTML-sider, men ren data i JSON-format, inni
- // i en string.
- data = data.toString();
- // IGNORER ALT INNI HASHTAGGENE TIL DU HAR LEST APP.POST-EN NOEN HAKK UNDER HER.
- // ###############################################################################
- // Undefined er basically null
- // Vi bytter ut litt data hvis brukeren allerede har logget inn.
- if (req.session.user != undefined) {
- data = data.replace('Log in', 'Log out') // f.eks. bytte ut tekst på login-knapp.
- .replace('<a href="/login">', '<a href="/logout">'); // og selve linken (HTML (dont worry dette ber vi om))
- }
- // ###############################################################################
- res.end( data );
- });
- });
- // Bare et annet lite eksempel, skjønner sikkert hva som skjer her
- // ..med mindre du ikke kan regex. Se regexr.com eller google it. Det som skjer her er at den matcher alle URLs med
- // /user/<hva som helst>.
- app.get(/\/user\/*/, function(req, res) {
- // Her kan du ENTEN ha et filsystem med brukere, som vil være database-uavhengig, men foreslår sql.
- // Henter ut det som kommer etter / i regex-en (stjernen i regexen)
- var brukernavn = req.url.substring( brukernavn.indexOf( '/user/' ) + 6 );
- // Se så lett det er å bruke mysql! Database er optional å inludere, men gjør det jo lettere da.
- var conn = mysql.createConnection({user: 'Gruppe4344', password: 'PekkaIsLovePekkaIsLife', database: 'PU' });
- var spørring = 'SELECT * FROM Users WHERE Username = ' + brukernavn;
- // Jeg liker rowsAsArray, men trenger ikke ha det med. Da blir resultatet på formen:
- // [ [rad1_kolonne1, rad1_kolonne2, rad1_kolonne...], [rad2_kolonne1, rad2_kolonne2, rad2_kolonne...], ...]
- // I denne spørringen vil det jo bare være
- // én rad (fordi brukernavn burde være unikt), så resultatet blir [[kol1, kol2, kol3, ...]], ELLER hvis det ikke finnes en bruker
- // med brukernavnet, blir det [[]] (tror jeg).
- var options = {sql: spørring, rowsAsArray: true};
- conn.query(options, function(err, rows) {
- if (err) { console.log(err); res.end('Error SQLing'); return; }
- // python-style if-s, hvis det er undefined (aka null), vil if-en ikke kjøre
- if (rows[0][0]) {
- // lese ny fil
- fs.readFile('public/welcome.html', function(err, data) {
- if (err) { console.log(err); res.end('Error zasdasd'); return; }
- data = data.toString(); // sånn vi kan jobbe med den
- // Her er det jeg snakket om, hvor du må bytte litt ut på ting i HTML-en basert på hvilken bruker det
- // er osv. Her er det vi i website-teamet som forteller dere nøyaktig hva som skal replaces (%username),
- // og nøyaktig hvilken data vi vil ha det byttet ut med (brukernavn et til brukeren, eller annen data).
- // Her har vi for eksempel en overskrift i HTML-en hvor det står <h1>Profile of %username</h1>.
- data = data.replace('%username', brukernavn);
- res.end(data);
- });
- }
- else { // hvis ingen sql-resultater => ingen bruker med navnet
- // Her kan en gjøre mye forskjellig, vi i website-teamet bestemmer jo hva som skal gjøres.
- // For eksempel sende 404, ha en egen user-not-found-side, bare helt enkelt:
- res.end('Username ' + brukernavn + ' does not exist.');
- }
- });
- });
- // POST-request, legg merke til app.post istedenfor .get
- app.post('/login', function(req, res) {
- // Her later vi som noen har sendt en HTML-form via POST som inneholder
- // username: <det han skrev inn>, password: <det han skrev inn>
- var brukernavn = req.body.username;
- var passord = req.body.password;
- var conn = mysql.createConnection({user: 'Gruppe4344', password: 'PekkaIsLovePekkaIsLife', database: 'PU' });
- var options = {sql: 'SELECT Password FROM Users WHERE Username = ' + brukernavn, rowsAsArray: true};
- conn.query(options, function(err, rows) {
- if (err) { console.log(err); res.end('Error zasdasd'); return; }
- if (rows[0][0]) { // vi har et resultat, så brukernavnet finnes
- if (rows[0][0] == passord) { // korrekt passord
- // Her brukes sessions for å huske brukeren, så han slipper logge inn hver eneste gang.
- // Kan kalle det hva som helst, user er bare et eksempel
- req.session.user = brukernavn;
- // Her skjer det litt. Dette er et alternativ til res.end. 301 betyr noe lignende .. et eller annet,
- // det er iallefall det jeg bruker for å redirecte lolz. Etter å ha satt brukernavn i session-en, sendes
- // brukeren til index-siden (den øverste app.get()-en). Kan selvfølgelig sende han hvor som helst, men på denne
- // måten ser du at når session-brukernavnet er satt, vil den if-en som spør om det bli aktivert.
- res.writeHead(301, {Location: '/'});
- }
- }
- });
- });
- // Bytt gjerne ut 1337 med whatever you want, portnummer.
- // Det er disse linjene som faktisk får serveren til å "bry seg", når du fra command-line skriver "node server.js"
- // (gitt at du kaller denne filen server.js)
- // Hvis folk nå går inn på <ip eller domene>:1337, blir den øverste app.get('/') aktivert.
- var server = app.listen(1337, function() {
- var host = server.address().address;
- var port = server.port;
- console.log('Listening on host ' + host + ', port ' + port);
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement