Novembre 2015

Volume 30 Numero 12

Il presente articolo è stato tradotto automaticamente.

Il lavoro programmatore - come essere media: routing rapido

Da Ted Neward | Novembre 2015

Ted NewardBentornati, "Nodeists". (Non ricevuto è chiaro se questo è il termine ufficiale per gli utenti di Node. js su base regolare, ma suoni Nodeists meglio a me "Nodeheads" o "Noderati" o "Nodeferatu".)

Il numero precedente (msdn.com/magazine/mt573719), lo stack dell'applicazione progressivamente era uno stack di "N" (solo nodo) a uno stack di "EN" per l'installazione di Express per accedere e Node. js. Come tentati come lo sarebbe per passare direttamente in altre cose, esistono alcuni aspetti su Express-supporto pacchetti e le librerie, che meritano esplorazione e la descrizione. È in precedenza hai un'idea di uno di questi, esprimere il routing, quando il codice imposta una funzione per visualizzare "Hello World" in risposta alle richieste HTTP per il percorso URL relativo "/". A questo punto, verrà andare un po' più a fondo nel mondo Express e viene illustrato come utilizzarlo in modo più efficace.

L'altro, chi desidera esaminare il codice più recenti e più grande viene scritto come parte di questa serie possono visitare il sito di Microsoft Azure che contiene il codice di questa serie (msdn mean.azurewebsites.net) più recente. È probabile che le informazioni contenute in questa colonna non è sincronizzate con quello sul sito, le pianificazioni di pubblicazione specificato e il sito viene fornita un'occhiata a ciò che sta per arrivare.

Routing, il ritorno

Riepilogo del file app. js dal numero precedente viene illustrata la natura singolo endpoint dell'applicazione che è stato compilato fin qui, come illustrato nella Figura 1, l'omaggio semplice ancora necessari ai dèi di informatica.

Figura 1 codice per il rapido "Hello World"

// Load modules
var express = require('express');
var debug = require('debug')('app');
// Create express instance
var app = express();
// Set up a simple route
app.get('/', function (req, res) {
  debug("/ requested");
  res.send('Hello World!');
});
// Start the server
var port = process.env.PORT || 3000;
debug("We picked up",port,"for the port");
var server = app.listen(port, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

La parte in questione è la sezione di codice con etichettata "Impostare una route semplice"; In questo caso, si sta stabilire un singolo endpoint, mappato per il verbo HTTP ("get") e il relativo endpoint dell'URL ("/," passato come primo argomento al metodo "get").

È abbastanza semplice per dedurre il modello per gli altri verbi HTTP, per una richiesta "POST", utilizzare il metodo post. per un "PUT," inserire; e "DELETE", utilizzare delete. Express supporta anche altri verbi, ma per motivi di abbastanza ovvio, sono le quattro che è più rilevante. Ciascuna anche quindi accetta come secondo argomento una funzione, che nell'esempio di Figura 1 è un valore letterale di funzione che gestisce la richiesta HTTP in ingresso.

La "E" Media

Spesso, quando Nodeists scrivere applicazioni basate su Express, a tale scopo in modo che ". NETers"scrivere applicazioni ASP.NET. Il server genera un documento HTML che contiene che la presentazione (HTML) combinata con i dati e lo invia al browser, dopo il quale l'utente compila un modulo e post di eseguire il backup dei dati immessi Express; In alternativa, l'utente fa clic su un collegamento e genera una richiesta GET al Express per eseguire nuovamente l'intero ciclo sul lato server. E, poiché grafia HTML in Node. js è solo molto divertente come in Visual Basic o c#, una serie di strumenti derivato del mondo di Node. js progettato per soddisfare lo stesso scopo Razor sintassi di una classica applicazione ASP.NET. Rende più semplice scrivere il livello di presentazione senza condiviso che derivano dall'unione di dati e codice eccessivo.

Tuttavia, in un'applicazione basata su Media, AngularJS costituiranno un'esperienza completa sul lato client, in modo rapido assume lo stesso ruolo di ASP.NET MVC, è semplicemente un livello di trasporto, estraggono i dati non elaborati (in genere in formato JSON) dal client, che agisce su tali dati (in genere archiviarlo, modifica o ricerca di dati associati o correlati) e l'invio di dati non elaborati (nuovamente in genere nel formato JSON) al livello client. A tale scopo, il soggiorno in Express si eviterà l'oggetto del Framework di creazione di modelli (dei quali è presente più di Node. js world, "hl" e "jade" vengono due dei più popolari), e verrà esaminata in modo esplicito in semplicemente shipping JSON e viceversa. Alcuni chiamerà un endpoint REST, ma, Francamente, REST implica molto più di un semplice HTTP e JSON e creazione di un sistema RESTful approvato Fielding è ben oltre l'ambito di questa serie.

Pertanto, per ora, parlerò permanente di un paio di endpoint semplice di sola lettura per qualsiasi client che utilizzano JSON da utilizzare.

Ciao, JSON

In genere, un'API Web segue una struttura piuttosto separata per l'acquisizione di dati:

  • Una richiesta GET per un tipo di risorsa specificato (ad esempio "persone") restituirà un risultato JSON che è una matrice di oggetti, ognuno contenente almeno un identificatore univoco (per il recupero di singolo) e in genere qualche breve testo descrittivo, che è possibile visualizzare un elenco di opzioni.
  • Tipo di una richiesta GET per una determinata risorsa con un identificatore come parte dell'URL ("persone/1234", dove 1234 è l'identificatore che identifica univocamente la persona che ci interessa) produrrà un risultato JSON (in genere) un singolo oggetto JSON che descrive la risorsa in un certo livello di dettaglio.

API Web verranno inoltre utilizzare PUT, POST e DELETE, ma per ora, mi concentrerò su solo il recupero dei dati.

Pertanto, se il tipo di risorsa è "persone", verranno create due endpoint, uno con l'etichetta "/ persone," e l'altro "/persons/ < GUID >." Per iniziare, è necessario "database" di persone di lavorare con un piccolo, i nomi e cognomi correnti "status" (qualsiasi si verificano per eseguire subito le) sarà sufficiente (vedere Figura 2).

Figura 2 Creazione di un Database di piccole dimensioni delle persone

var personData = [
  {
    "id": 1,
    "firstName": "Ted",
    "lastName": "Neward",
    "status": "MEANing"
  },
  {
    "id": 2,
    "firstName": "Brian",
    "lastName": "Randell",
    "status": "TFSing"
  }
];

Non è esattamente l'operazione SQL Server, ma per ora.

Successivamente, è necessario l'endpoint per una raccolta completa delle persone:

var getAllPersons = function(req, res) {
  var response = personData;
  res.send(JSON.stringify(response));
};
app.get('/persons', getAllPersons);

Si noti che in questo caso, il mapping della route utilizza una funzione autonoma (getAllPersons), che è più comune, poiché aiuta a mantenere una separazione delle problematiche più pulita, la funzione agisce come un controller (in senso Model-View-Controller). Per ora, che consente di serializzare la matrice di oggetti JavaScript in una rappresentazione JSON stringify, ma verrà utilizzato più elegante qualcosa in un secondo momento.

Successivamente, è necessario un endpoint per gli oggetti di persona, ma verrà visualizzata un'ulteriore operazione perché è necessario prelevare l'identificatore della persona come parametro ed Express dispone di un determinato modo di procedere. Per (probabilmente il modo più semplice nell'area di operazioni) è possibile utilizzare l'oggetto "params" dell'oggetto della richiesta (il parametro "req" per la funzione utilizzata nella mappa route) per recuperare il parametro specificato nella route, ma Node. js è possibile utilizzare anche una funzione di parametro per eseguire più operazioni, è un tipo di filtro che verrà richiamato quando viene trovato un parametro di un particolare modello di denominazione :

app.get('/persons/:personId', getPerson);
app.param('personId', function (req, res, next, personId) {
  debug("personId found:",personId);
  var person = _.find(personData, function(it) {
    return personId == it.id;
  });
  debug("person:", person);
  req.person = person;
  next();
});

Quando viene richiamata la route, qualsiasi segue "/ persone" (come in "/ persone/1") verrà associata in un parametro di nome "personId," così come è possibile con ASP.NET MVC. Ma si quando si utilizza la funzione param, che verrà richiamato quando una route con ": personId" viene richiamato, viene richiamata la funzione associata, che eseguirà la ricerca (tramite la ricerca della funzione pacchetto "lodash", come illustrato nel frammento di codice precedente) dal database di piccole dimensioni personData. Quindi, tuttavia, viene aggiunto all'oggetto "req" (in quanto gli oggetti JavaScript sono tipizzati sempre in modo dinamico, è semplice eseguire), in modo che sia disponibile per il resto di ciò che viene richiamato, che in questo caso sarà la funzione getPerson, a questo punto diventa piuttosto semplice, poiché l'oggetto a cui si desidera restituire viene già recuperato:

var getPerson = function(req, res) {
  if (req.person) {
    res.send(200, JSON.stringify(req.person));
  }
  else {
    res.send(400, { message: "Unrecognized identifier: " + identifier });
  }
};

Vedere cosa si intende per "semplici"?

Avvolgendo

Ho un po' più a che fare con Express, ma nonostante sia attraversando un periodo di seguito, mi spazio sufficiente per uno, quindi... buona codifica!


Ted Newardè CTO iTrellis, una società di servizi di consulenza. Egli ha scritto oltre 100 articoli e creati o coautore di numerosi libri, tra cui "Professional F # 2.0" (Wrox, 2010). È un MVP di F # e come relatore a conferenze in tutto il mondo. Fornisce consulenze e mentors regolarmente, contattarlo all'indirizzo ted@tedneward.com o ted@itrellis.com se si è interessati.

Grazie all'esperto tecnica seguente per la revisione di questo articolo: Shawn Wildermuth