2012-10-13 198 views
7

Estoy tratando de entender las transmisiones de Node.js, aunque no soy bastante nuevo en JavaScript y en los nodos, los últimos idiomas que obtuve fueron Perl y PHP: - DPiping/streaming de objetos de JavaScript en Node.js

He leído la documentación Buffer/Streams @ nodejs.org, vi James Halliday @LXJS, leí su manual de flujo y Thorsten Lorenz event-stream post. Comienzo a entender los conceptos básicos :)

Procesar datos que se serializan en RDF (que no es ni JSON ni XML). Logro obtener los datos (en código real a través de la solicitud) y analizarlos en un objeto JS usando el módulo rdfstore.

Hasta ahora hago esto:

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

Dónde serialize() hace el trabajo de analizar un serializar el código al mismo tiempo en este momento. Yo uso el módulo through para interactuar con la transmisión.

Ahora tienen algunos métodos más (no la declaración de función real, pero espero que usted consigue el punto):

  • getRecipe(parsedRDF) -> toma el RDF analizado (como un objeto JavaScript) y me dice cómo utilizar que
  • createMeal(parsedRDF, recipe) -> toma el RDF analizada y la receta de arriba y crea un nuevo objeto RDF fuera de él
  • este nuevo objeto tiene que llegar serializa y se envía al navegador
  • (En el Wil mundo real getRecipe Tengo que hacer una interacción del usuario en el navegador)

Me gusta la idea de encadenar esto a través de tuberías para una mayor flexibilidad cuando realizo el código más adelante. Pero no quiero serializarlo en una serialización RDF cada vez, sino simplemente enviarlo alrededor del objeto JS. Por lo que he leído en la documentación, podría usar el módulo stringify para obtener una cadena de cada paso para pasar al próximo paso. Pero:

  • ¿esto realmente tiene sentido? En términos de, ¿agrego una sobrecarga innecesaria o esto es insignificante?
  • No veo cómo podría dar el análisis sintáctico sintáctico a ambos métodos con la dependencia de que se debería llamar primero a getRecipe y también a la salida para createMeal. ¿Hay módulos que me ayuden en eso?
  • Puede ser que tenga que pedirle al usuario la selección de la receta final, así que podría necesitar enviar cosas al navegador allí para obtener la respuesta final. ¿Puedo hacer algo como esto sobre tomas mientras la tubería está "esperando"?

Espero que esto muestre lo que estoy tratando de hacer, si no intentaré dar más detalles/reformular.

Actualización: Después de dormir sobre ella me di cuenta de algunas cosas más:

  • Es probable que no tiene sentido para serializar un formato como RDF en algo no estándar si hay formatos oficiales de serialización.Entonces, en lugar de usar stringify simplemente pasaré una serialización RDF oficial entre los pasos
  • Esto implica que analizo/serializo los objetos en cada paso y esto seguramente agrega sobrecarga. La pregunta es ¿me importa? Podría ampliar el módulo de RDF que utilizo para analizar de la corriente y serializar en una
  • puedo resolver el problema de la dependencia entre getRecipe y createMeal simplemente añadiendo alguna información de getRecipe a parseRDF, esto se puede hacer muy fácilmente con RDF sin rompiendo el modelo de datos original. Pero yo todavía estaría interesado en saber si yo podría manejar las dependencias de este tipo con tubos

Respuesta

5

sí, está bien para hacer una corriente de objetos js, sólo hay que recordar a canalizarla a través de algo que va a serializar el transmitir nuevamente antes de escribirlo en IO.

me gustaría recomendar a escribir un módulo llamado rdfStream que se analiza y serializa RDF, que lo utilizaría como esto

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. 

y que también podría ser utilizado por otras personas que trabajan con RDF en el nodo, impresionante!

+0

Gracias por la respuesta, de hecho agregaré soporte para tuberías a la biblioteca RDF y también lo habilitaré como módulo. –