javascript - Razumijevanje kako koristiti NodeJS za stvaranje jednostavnog backend-a
Pokušavam razviti prilično jednostavan server u nodejs-u. U osnovi, ono što želim je jednostavan API koji zahtijeva autentifikaciju (jednostavan stil korisničkog imena/lozinke). Ono što mi ne treba je bilo kakva frontend funkcionalnost (templating itd.). Moj problem je što ne mogu shvatiti pristup express/node.
Konkretno, moja pitanja su:
- Kako da povežem autentifikaciju? Trebam li proslijediti više rukovatelja na svaku rutu koja zahtijeva autentifikaciju, ili postoji elegantniji način za to?
- Kako radi Express middleware (kao
app.use(express.bodyParser()))? Mijenjaju li oni sadržajrequestiliresponseobjekta? Konkretno, ako koristim body parser (unutarnje formidable?), gdje mogu pristupiti podacima zahtjeva koje on treba parsirati? - Kada koristim autentifikaciju i, recimo, imam vjerodajnice pohranjene u bazi podataka s više informacija o pojedinom klijentu, u kojem trenutku izvlačim te informacije? Naime, kada se korisnik prijavi, dohvaćam li zapis korisnika prilikom prijave i prosljeđujem ga dalje, ili ga dohvaćam u svakom handleru koji zahtijeva te informacije?
- Na kraju, znate li za neku open source aplikaciju koju bih mogao pogledati? Volio bih vidjeti nešto što ima jednostavnu autentifikaciju i možda čak koristi formidable, budući da je prijenos datoteke jedan od mojih zahtjeva.
Kao što sam ranije spomenuo, vjerujem da je moj problem u konačnici teškoća s funkcijski orijentiranim pristupom u nodeu (također, imam prilično ograničeno iskustvo u programiranju webservisa). Ako znate neki resurs gdje bih mogao čitati o pristupu arhitekturi nodejs aplikacije, molim vas, ne oklijevajte me uputiti na njega.
Odgovor #1
Kako povezujem autentifikaciju? Trebam li proslijediti više rukovatelja u svaku rutu koja zahtijeva autentifikaciju, ili postoji elegantniji način za to?
Trebali biste koristiti session middleware. Evo malo pseudo koda:
var http = require('http');
var app = express();
var authorize = function(req, res, next) {
if(req.session && req.session.appname && req.session.appname === true) {
// redirect to login page
return;
}
next();
}
app.use(express.session());
app.all('/admin*', authorize, function(req, res, next) {
});
Kako Express middleware (poput app.use(express.bodyParser())) radi? Mijenjaju li sadržaj request ili response objekta? Konkretno, ako koristim body parser (unutarnje formidable?), gdje pristupam podacima iz requesta koje bi to trebalo parsirati?
Svaki middleware ima pristup objektu zahtjeva i odgovora. Dakle, da, on ga mijenja. Normalno je dodavati mu svojstva. To znači da unutar vašeg handlera (koji je također middleware) možete napisati:
if(req.body && req.body.formsubmitted && req.body.formsubmitted === 'yes') {
var data = {
title: req.body.title,
text: req.body.text,
type: req.body.type
}
// store the data
}
Kada koristim autentifikaciju i, recimo, imam vjerodajnice pohranjene u bazi podataka zajedno s više informacija o pojedinom klijentu, u kojem trenutku izvlačim te informacije? Dakle, kada se korisnik prijavi, dohvaćam li zapis korisnika prilikom prijave i prosljeđujem ga dalje, ili ga dohvaćam u svakom handleru koji zahtijeva te informacije?
Mislim da bi trebao raditi stvari na isti način kao u bilo kojem drugom serverskom jeziku. Drži stanje korisnika (prijavljen/nena prijavljen) unutar sesije. Također možeš držati ID korisnika i dohvaćati podatke za njega koliko god ti treba. Ovisi o tvom slučaju, ali imaš mogućnost keširanja informacija. Zato što node nije kao PHP, na primjer, mislim da ne umire.
Na kraju, znate li za neku open source aplikaciju koju bih mogao pogledati? Volio bih vidjeti nešto što ima jednostavnu autentifikaciju i možda čak koristi formidable, budući da je učitavanje datoteke jedan od mojih zahtjeva.
Da. Napisao sam članak o zaista jednostavnoj MVC web stranici s admin panelom. Dostupan je ovdje. A njegov kod je ovdje.
Odgovor #2
Jednostavan način za implementaciju autentifikacije (ako ne želite koristiti dodatne module):
var checkAuth = function(req, res, next) {
if(!req.session.user)
{
// Redirect to login form
res.redirect("/login");
}
else
{
// Proceed to member's area
next();
}
};
app.get("/member/page", checkAuth, function(req, res) {
// render view, etc
});
bodyParser parsira/pretvara tijelo POST zahtjeva u objekt, što pomaže pri dobivanju vrijednosti iz obrasca.
Ruta koja obrađuje slanje vašeg obrasca za prijavu može pristupiti korisničkom imenu/lozinki ovako:
var username = req.body.username;
var password = req.body.password;
U ovom trenutku biste upitali svoju bazu podataka da odaberete iz tablice korisnika gdje se korisničko ime i lozinka podudaraju (u proizvodnom okruženju željeli biste koristiti enkripciju lozinke).
Ako dobijete zapis natrag u rezultatu upita, postavite ga u sesiju. Jednostavan način da to učinite je:
req.session.user = userRecord
(Prilagodite za vaš posrednički sloj sesije)
