javascript - Ymmärtäminen siitä, kuinka käyttää NodeJS:ää yksinkertaisen backendin luomiseen


Olen yrittänyt kehittää melko yksinkertaista palvelinta nodejs:ssä. Periaatteessa tavoitteenani on yksinkertainen API, joka vaatii tunnistautumisen (yksinkertainen käyttäjänimi/salasana-tyyli). Mitä en tarvitse, on minkäänlainen frontend-toiminnallisuus (templaaminen jne.). Ongelmani on, etten tunnu saavan otetta express/node-lähestymistavasta.

Erityisesti kysymykseni ovat:

  • Kuinka liitän todennuksen? Pidänkö siirtää useita käsittelijöitä jokaiseen reittiin, joka vaatii todennuksen, vai onko tähän olemassa tyylikkäämpi tapa?
  • Miten Expressin middleware (kuten app.use(express.bodyParser())) toimii? Muokkaavatko ne request- tai response-objektin sisältöä? Erityisesti, jos käytän body parseria (sisäisesti formidable?), mistä pääsen käsiksi pyyntödataan, jota tämän pitäisi jäsentää?
  • Kun käytän todennusta ja minulla on esimerkiksi tunnistetiedot tallennettuna tietokantaan, jossa on enemmän tietoa yksittäisestä siihen liittyvästä asiakkaasta, missä vaiheessa otan kyseisen tiedon? Eli kun käyttäjä kirjautuu sisään, haenko käyttäjätiedot kirjautumisen yhteydessä ja välitänkö ne eteenpäin, vai haenko ne jokaisessa käsittelijässä, joka tarvitsee tietoa?
  • Lopulta, tiedätkö jonkin avoimen lähdekoodin sovelluksen, jota voisin katsella? Haluaisin nähdä jotain, jossa on yksinkertainen todennus ja ehkä jopa käyttää formidablea, koska tiedoston lataaminen on yksi vaatimuksistani.

Kuten mainitsin aiemmin, uskon, että ongelmani on lopulta vaikeus funktionaalisessa lähestymistavassa nodessa (myös, minulla on melko rajallinen kokemus verkkopalveluohjelmoinnista). Jos tiedät resurssin, josta voisin lukea, miten lähestyä nodejs-sovelluksen arkkitehtuurin suunnittelua, älä epäröi ohjata minut sen luo.

Vastaus #1

Kuinka liitän todennuksen? Pitäisikö minun ohjata useita käsittelijöitä jokaiseen reittiin, joka vaatii todennusta, vai onko tähän olemassa tyylikkäämpi tapa?

Sinun pitäisi käyttää istuntoväliohjelmaa. Tässä on hieman pseudokoodia:

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

});

Miten Express-middleware (kuten app.use(express.bodyParser())) toimii? Muuttavatko ne pyyntö- tai vastausobjektin sisältöä? Erityisesti, jos käytän body parseria (sisäisesti formidable?), mistä pääsen käsiksi pyyntötietoihin, joita tämän pitäisi jäsentää?

Jokaisella middlewarella on pääsy pyyntö- ja vastauskohteeseen. Joten kyllä, se muokkaa sitä. Yleensä siihen liitetään ominaisuuksia. Tämä tarkoittaa, että käsittelijäsi sisällä (joka on myös middleware) voit kirjoittaa:

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
}

Kun käytän autentikointia ja minulla on esimerkiksi tunnistetiedot tallennettuna tietokantaan, jossa on enemmän tietoa yksittäisestä siihen liittyvästä asiakkaasta, missä vaiheessa otan sen tiedon ulos? Eli kun käyttäjä kirjaantuu sisään, haenko käyttäjätietueen kirjautumisen yhteydessä ja välitän sen eteenpäin, vai haenko sen jokaisessa käsittelijässä, joka tarvitsee tietoa?

Mielestäni sinun pitäisi tehdä asiat samalla tavalla kuin missä tahansa muussa palvelinpuolen kielessä. Pidä käyttäjän tila (kirjautunut/ei kirjautunut) istunnossa. Voit myös tallentaa käyttäjän id:n ja hakea hänelle tarvitsemasi tiedot. Se riippuu tapauksestasi, mutta sinulla on mahdollisuus välimuistittaa tietoa. Koska Node ei ole kuten esimerkiksi PHP, tarkoitan, että se ei kuole.

Lopulta, tiedätkö avoimen lähdekoodin sovellusta, johon voisin tutustua? Haluaisin nähdä jotain, jossa on yksinkertainen todennus ja joka ehkä käyttää jopa Formidablaa, koska tiedoston lataaminen on yksi vaatimuksistani.

Jep. Kirjoitin artikkelin todella yksinkertaisesta MVC-verkkosivustosta, jossa on hallintapaneeli. Se on saatavilla täällä. Ja sen koodi on täällä.

Vastaus #2

Yksinkertainen tapa toteuttaa todennus (jos et halua käyttää lisämoduuleja):

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 jäsentää/muuntaa POST-pyynnön rungon objektiksi, mikä auttaa lomakkeen lähetys-arvojen saamisessa.

Reitti, joka käsittelee kirjautumislomakkeesi lähetyksen, voi käyttää käyttäjänimeä/salasanaa näin:

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

Tässä vaiheessa kysyisit tietokannastasi valitaksesi käyttäjiä, joissa käyttäjänimi ja salasana täsmäävät (haluaisit käyttää salasanan salausta tuotantoympäristössä).

Jos saat tietueen takaisin kyselytuloksessa, aseta se istuntoon. Yksinkertainen tapa tehdä tämä on:

req.session.user = userRecord

(Säädä istuntosi väliohjelmiston mukaan)