2012-10-13 17 views
7

Sto cercando di comprendere i flussi di Node.js, non che io sia piuttosto nuovo per JavaScript e nodo, le ultime lingue che ho davvero avuto sono Perl e PHP: - DPiping/streaming di oggetti JavaScript in Node.js

Ho letto la documentazione di Buffer/Streams @ nodejs.org, ho visto James Halliday @LXJS, ho letto il suo manuale di flusso e Thorsten Lorenz event-stream post. Inizio a capire le basi :)

I dati di processo che sono serializzati in RDF (che non è né JSON né XML). Riesco a recuperare i dati (in codice reale su richiesta) e analizzarli in un oggetto JS utilizzando il modulo rdfstore.

Finora faccio questo:

s.createReadStream('myRDFdata.ttl').pipe(serialize()).pipe(process.stdout); 

Dove serialize() fa il lavoro di analisi di un serializzare il codice, allo stesso tempo in questo momento. Io uso il modulo through per interfacciarlo allo stream.

ora ho alcuni più metodi (non è il vero dichiarazione di funzione, ma spero che si ottiene il punto):

  • getRecipe(parsedRDF) -> prende il RDF analizzato (come un oggetto JavaScript) e mi dice come utilizzare si
  • createMeal(parsedRDF, recipe) -> prende il CDR analizzato e la ricetta dall'alto e crea un nuovo oggetto RDF fuori di esso
  • questo nuovo oggetto ha bisogno di ottenere serializzato e inviato al browser
  • (Nel mondo reale getRecipe wil Devo fare un'interazione utente nel browser)

Mi piace l'idea di concatenare questo insieme tramite i tubi per una maggiore flessibilità quando migliorerò il codice in seguito. Ma non voglio serializzarlo ogni volta su una serializzazione RDF ma semplicemente mandare in giro l'oggetto JS. Da quanto ho letto nella documentazione, potrei usare il modulo stringify per ottenere una stringa da ogni passaggio per collegarlo al passaggio successivo. Ma:

  • ha davvero senso? In termini di costi aggiuntivi non necessari o è trascurabile?
  • Non vedo come potrei dare il parsedRDF a entrambi i metodi con la dipendenza che getRecipe dovrebbe essere chiamato per primo e l'uscita è l'input per createMeal pure. Ci sono moduli che mi aiutano in questo?
  • Potrebbe essere che devo chiedere all'utente la selezione della ricetta finale, quindi potrei aver bisogno di inviare cose al browser lì per ottenere la risposta finale. Posso fare qualcosa di simile alle prese mentre la pipa è "in attesa"?

Spero che questo mostri ciò che sto cercando di fare, altrimenti proverò a fornire maggiori dettagli/riformulazione.

Aggiornamento: Dopo aver dormito su di esso ho capito alcune cose:

  • Probabilmente non ha senso per serializzare un formato simile RDF in qualcosa di non-standard, se ci sono i formati ufficiali di serializzazione.Quindi, invece di utilizzare stringify, passerò semplicemente una serializzazione ufficiale RDF tra i passaggi
  • Ciò implica che analizzo/serializzi gli oggetti in ogni passaggio e questo sicuramente aggiunge un sovraccarico. Mi interessa? Ho potuto estendere il modulo RDF che utilizzo per analizzare dal flusso e serializzare in uno
  • posso risolvere il problema con la dipendenza tra getRecipe e createMeal semplicemente aggiungendo alcune informazioni da getRecipe a parseRDF, questo può essere fatto molto facilmente con RDF colpo rompere il modello di dati originale. Ma sarei ancora interessato a sapere se ho potuto gestire dipendenze come questa, con i tubi

risposta

5

Sì, è bene fare un flusso di oggetti js, basta ricordarsi di tubo attraverso qualcosa che serializzare il ritorna di nuovo dopo averlo scritto su IO.

avrei raccomando a scrivere un modulo chiamato rdfStream che analizza e serializza RDF, si può usare in questo modo

var rdf = require('rdf-stream') 

fs.createReadStream(file) //get a text stream 
    .pipe(rdf.parse())  //turn it into objects 
    .pipe(transform)  //optional, do something with the objects 
    .pipe(rdf.stringify()) //turn back into text 
    .pipe(process.stdout) //write to IO. 

e potrebbe essere utilizzato anche da altre persone che lavorano con RDF nel nodo, impressionante!

+0

Grazie per la risposta, aggiungerò il supporto per le pipe alla libreria RDF e renderlo disponibile anche come modulo! –