Vyhledávání na webu

javascript - Pochopení toho, jak používat NodeJS pro vytvoření jednoduchého backendu


Snažil jsem se vyvinout poměrně jednoduchý server v nodejs. V podstatě se snažím vytvořit jednoduché API, které vyžaduje autentizaci (jednoduchý styl uživatelského jména/hesla). Co nepotřebuji, je jakákoli funkcionalita frontendu (šablonování apod.). Můj problém je, že se nemohu zorientovat v přístupu express/node.

Konkrétně jsou moje otázky:

  • Jak zapojím autentizaci? Mám předávat několik handlerů do každé trasy, která vyžaduje autentizaci, nebo existuje elegantnější způsob, jak to udělat?
  • Jak funguje middleware Express (například app.use(express.bodyParser()))? Mění obsah objektu request nebo response? Konkrétně, pokud používám body parser (interně formidable?), kde se dostanu k datům požadavku, která má tento parser zpracovat?
  • Při použití autentizace a pokud mám například přihlašovací údaje uložené v databázi s dalšími informacemi o jednotlivém klientovi, v jakém okamžiku tyto informace získávám? Tedy když se uživatel přihlásí, získám záznam uživatele při přihlášení a předám jej dál, nebo jej získávám v každém handleru, který tyto informace vyžaduje?
  • Nakonec, znáte nějakou open source aplikaci, na kterou bych se mohl podívat? Rád bych viděl něco, co má jednoduché ověřování a možná dokonce využívá formidable, protože nahrávání souboru je jedním z mých požadavků.

Jak jsem již zmínil, věřím, že můj problém je nakonec obtíž s funkčně orientovaným přístupem v node (také mám spíše omezené zkušenosti s programováním webových služeb). Pokud znáte nějaký zdroj, kde bych si mohl přečíst, jak přistupovat k architektuře aplikace v nodejs, prosím neváhejte mě na něj nasměrovat.

Odpověď č. 1

Jak zapojím autentizaci? Předávám několik handlerů do každé trasy, která vyžaduje autentizaci, nebo existuje elegantnější způsob, jak to udělat?

Měli byste použít middleware pro relace. Zde je nějaký pseudo kód:

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) {

});

Jak funguje middleware Express (například app.use(express.bodyParser()))? Mění obsah objektu request nebo response? Konkrétně, pokud používám body parser (interně formidable?), kde získám přístup k datům requestu, která má tento parser zpracovat?

Každý middleware má přístup k objektu požadavku a odpovědi. Takže ano, upravuje je. Obvykle k nim přidává vlastnosti. To znamená, že uvnitř vašeho handleru (který je také middleware) můžete napsat:

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
}

Při používání autentizace a pokud mám například uložené přihlašovací údaje v databázi s dalšími informacemi o jednotlivém klientovi, kdy tyto informace získávám? Tj. když se uživatel přihlásí, získám záznam uživatele při přihlášení a předám jej dál, nebo jej získávám v každém handleru, který tyto informace vyžaduje?

Myslím, že byste měli dělat věci stejně jako v jakémkoli jiném serverovém jazyce. Uchovávejte stav uživatele (přihlášen/nepřihlášen) uvnitř session. Můžete také uchovávat ID uživatele a načítat pro něj data, která potřebujete. Záleží na vašem konkrétním případě, ale máte možnost ukládat informace do cache. Protože Node není jako PHP například, myslím tím, že neumírá.

Nakonec, znáte nějakou open source aplikaci, na kterou bych se mohl podívat? Rád bych viděl něco, co má jednoduché ověřování a možná dokonce využívá formidable, protože nahrávání souboru je jedním z mých požadavků.

Jo. Napsal jsem článek o opravdu jednoduchém webu MVC s administrátorským panelem. Je k dispozici zde. A jeho kód je zde.

Odpověď č. 2

Jednoduchý způsob, jak implementovat ověřování (pokud nechcete používat další moduly):

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 analyzuje/převádí tělo POST požadavku na objekt, což pomáhá při získávání hodnot odeslaných formulářem.

Trasa, která zpracovává odeslání vašeho přihlašovacího formuláře, může přistupovat k uživatelskému jménu/heslu takto:

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

V tomto bodě byste dotázali svou databázi, abyste vybrali uživatele, kde se uživatelské jméno a heslo shodují (v produkčním prostředí byste chtěli používat šifrování hesel).

Pokud ve výsledku dotazu získáte záznam, nastavte ho v relaci. Jednoduchý způsob, jak to udělat, je:

req.session.user = userRecord

(Upravte pro svůj session middleware)