javascript - Forstå hvordan man bruker NodeJS for å lage en enkel backend
Jeg har prøvd å utvikle en ganske enkel server i nodejs. I bunn og grunn, det jeg er ute etter er en enkel API som krever autentisering (enkel brukernavn/passord-stil). Det jeg ikke trenger er noen form for frontend-funksjonalitet (templating etc.). Problemet mitt er at jeg ikke får helt taket på tilnærmingen til express/node.
Spesifikt er spørsmålene mine:
- Hvordan kobler jeg inn autentiseringen? Sender jeg flere håndterere til hver rute som krever autentisering, eller finnes det en mer elegant måte å gjøre dette på?
- Hvordan fungerer Express-mellomvare (som
app.use(express.bodyParser()))? Endrer de innholdet irequestellerresponse-objektet? Spesielt, hvis jeg bruker body parser (internt formidable?), hvor får jeg tilgang til forespørselsdataene som dette skal analysere? - Når jeg bruker autentisering og jeg har, for eksempel, legitimasjon lagret i en database med mer informasjon om den individuelle klienten som er tilknyttet, på hvilket tidspunkt henter jeg ut den informasjonen? Det vil si, når en bruker logger inn, henter jeg brukeroppføringen ved innlogging og sender den videre, eller henter jeg den i hver handler som krever informasjonen?
- Til slutt, kjenner du til en åpen kildekode-applikasjon som jeg kunne ta en titt på? Jeg vil gjerne se noe som har enkel autentisering og kanskje til og med bruker formidable, siden opplasting av en fil er ett av kravene mine.
Som jeg nevnte tidligere, tror jeg at problemet mitt i bunn og grunn er en vanskelighet med den funksjonsorienterte tilnærmingen i node (i tillegg har jeg ganske begrenset erfaring med webtjenesteprogrammering). Hvis du kjenner til en ressurs hvor jeg kan lese om hvordan man kan gå frem for å arkitektere en nodejs-app, ikke nøl med å vise meg den.
Svar #1
Hvordan kobler jeg inn autentiseringen? Skal jeg sende flere handlere inn i hver rute som krever autentisering, eller finnes det en mer elegant måte å gjøre dette på?
Du bør bruke session-middleware. Her er litt pseudokode:
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) {
});
Hvordan fungerer Express-mellomvare (som app.use(express.bodyParser()))? Endrer de innholdet i request- eller response-objektet? Spesielt, hvis jeg bruker body parser (internt formidable?), hvor får jeg tilgang til request-dataene som dette skal parse?
Hver middleware har tilgang til forespørsel- og responsobjektet. Så ja, den endrer det. Vanligvis legger man til egenskaper i det. Dette betyr at inne i handleren din (som også er en middleware) kan du skrive:
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
}
Når jeg bruker autentisering og jeg har for eksempel legitimasjon lagret i en database med mer informasjon om den enkelte klienten som er tilknyttet, på hvilket tidspunkt henter jeg ut den informasjonen? Det vil si, når en bruker logger inn, henter jeg brukerposten ved pålogging og viderefører den, eller henter jeg den i hver handler som krever informasjonen?
Jeg synes at du bør gjøre ting på samme måte som i hvilket som helst annet serverspråk. Hold brukerens tilstand (pålogget/ikke pålogget) inne i en sesjon. Du kan også lagre brukerens ID og hente dataene for ham uansett hva du trenger. Det avhenger av ditt tilfelle, men du har muligheten til å cache informasjon. Fordi node ikke er som PHP for eksempel, jeg mener det dør ikke.
Til syvende og sist, kjenner du til en åpen kildekode-applikasjon som jeg kunne ta en titt på? Jeg vil gjerne se noe som har enkel autentisering og kanskje til og med bruker formidable, siden opplasting av en fil er et av kravene mine.
Jepp. Jeg skrev en artikkel om en veldig enkel MVC-nettside med administrasjonspanel. Den er tilgjengelig her. Og koden til den er her.
Svar #2
En enkel måte å implementere autentisering på (hvis du ikke vil bruke tilleggmoduler):
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 analyserer/konverterer kroppen til en POST-forespørsel til et objekt, noe som hjelper med å hente verdier fra skjema-innsending.
Ruten som håndterer innsendelsen av påloggingsskjemaet ditt kan få tilgang til brukernavn/passord på denne måten:
var username = req.body.username;
var password = req.body.password;
På dette punktet ville du spurt databasen din for å velge fra brukere der brukernavnet og passordet stemmer overens (du vil ønske å bruke passordkryptering i et produksjonsmiljø).
Hvis du får en post tilbake i spørringsresultatet, sett den i økten. En enkel måte å gjøre dette på er:
req.session.user = userRecord
(Juster for din sesjons-mellomvare)
