javascript - Forståelse af, hvordan man bruger NodeJS til at oprette en simpel backend


Jeg har forsøgt at udvikle en ret simpel server i nodejs. Grundlæggende er det, jeg går efter, en simpel API, der kræver autentificering (simpel brugernavn/adgangskode-stil). Hvad jeg ikke har brug for, er nogen form for frontend-funktionalitet (skabelon osv.). Mit problem er, at jeg ikke kan få styr på tilgangen med express/node.

Specifikt er mine spørgsmål:

  • Hvordan kobler jeg autentifikationen ind? Skal jeg sende flere handlers ind i hver rute, der kræver autentifikation, eller er der en mere elegant måde at gøre dette på?
  • Hvordan fungerer Express-middleware (som app.use(express.bodyParser()))? Ændrer de indholdet af request- eller response-objektet? Specifikt, hvis jeg bruger body parseren (internt formidable?), hvor kan jeg få adgang til de anmodningsdata, som denne skal analysere?
  • Når jeg bruger godkendelse, og jeg har for eksempel legitimationsoplysninger gemt i en database med mere information om den enkelte kunde, hvornår udtrækker jeg så de oplysninger? Dvs. når en bruger logger ind, henter jeg brugerposten ved login og sender den videre, eller henter jeg den i hver handler, der kræver oplysningerne?
  • I sidste ende, kender du til en open source-applikation, som jeg kunne se nærmere på? Jeg vil gerne se noget, der har simpel autentificering og måske endda bruger formidable, da upload af en fil er et af mine krav.

Som jeg nævnte tidligere, tror jeg, at mit problem i sidste ende er en vanskelighed med den funktionsorienterede tilgang i node (desuden har jeg ret begrænset erfaring med webservice-programmering). Hvis du kender en ressource, hvor jeg kunne læse om, hvordan man angriber arkitekturen af en nodejs-app, så tøv ikke med at pege mig i den retning.

Svar #1

Hvordan tilslutter jeg autentifikationen? Skal jeg sende flere handlers til hver rute, der kræver autentifikation, eller er der en mere elegant måde at gøre dette på?

Du bør bruge session middleware. Her er noget 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-middleware (som app.use(express.bodyParser()))? Ændrer de indholdet af request- eller response-objektet? Specifikt, hvis jeg bruger body-parseren (internt formidable?), hvor får jeg adgang til de forespørgselsdata, som den skal analysere?

Hver middleware har adgang til request- og response-objektet. Så ja, det ændrer det. Normalt tilføjes egenskaber til det. Dette betyder, at du inden for din handler (som også er en middleware) kan 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 bruger autentificering, og jeg har for eksempel adgangsoplysninger gemt i en database med mere information om den enkelte tilknyttede klient, på hvilket tidspunkt henter jeg så disse oplysninger? Dvs. når en bruger logger ind, henter jeg brugeroptegnelsen ved login og viderefører den, eller henter jeg den i hver handler, der kræver oplysningerne?

Jeg synes, at du bør gøre tingene på samme måde som i ethvert andet server-side sprog. Hold brugerens tilstand (logget ind/ikke logget ind) inde i en session. Du kan også gemme brugerens id og hente dataene for ham, hvad end du har brug for. Det afhænger af din situation, men du har mulighed for at cache information. Fordi Node ikke er som PHP for eksempel, jeg mener, det dør ikke.

I sidste ende, kender du en open source-applikation, som jeg kunne tage et kig på? Jeg vil gerne se noget, der har simpel autentificering og måske endda bruger formidable, da upload af en fil er et af mine krav.

Ja. Jeg skrev en artikel om en rigtig simpel MVC-webside med adminpanel. Den er tilgængelig her. Og koden til den er her.

Svar #2

En enkel måde at implementere autentifikation på (hvis du ikke vil bruge yderligere moduler):

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 af en POST-anmodning til et objekt, hvilket hjælper med at få værdier fra formularindsendelser.

Ruten, der håndterer din loginformulars indsendelse, kan få adgang til brugernavn/adgangskode på denne måde:

var username = req.body.username;
var password = req.body.password;

På dette tidspunkt ville du forespørge din database for at vælge fra brugere, hvor brugernavnet og adgangskoden stemmer overens (du vil gerne bruge adgangskodekryptering i et produktionsmiljø).

Hvis du får en post tilbage i forespørgselsresultatet, skal du sætte den i sessionen. En nem måde at gøre dette på er:

req.session.user = userRecord

(Juster til din session-middleware)