2012-10-13 15 views
7

Staram się owijać głowę strumieniami Node.js, nie jestem całkiem nowym użytkownikiem JavaScript i węzła, ostatnie języki, które naprawdę mam, to Perl i PHP: - DOrurowanie/przesyłanie strumieniowe obiektów JavaScript w Node.js

Przeczytałem dokumentację bufora/strumieni @ nodejs.org, obejrzałem James Halliday @LXJS, przeczytałem jego podręcznik do streamowania i Thorsten Lorenz event-stream post. Zaczynam rozumieć podstawy :)

Przetwarzam dane, które są serializowane w RDF (który nie jest ani JSON ani XML). Udaje mi się pobrać dane (w prawdziwym kodzie na żądanie) i przeanalizować je w obiekcie JS przy użyciu modułu rdfstore.

tej pory mam to zrobić:

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

Gdzie serialize() wykonuje pracę parsowanie szeregowania kod w tym samym czasie w tej chwili. Używam modułu through do połączenia ze strumieniem.

Teraz mam jeszcze kilka metod (nie deklarację funkcji prawdziwe, ale mam nadzieję, że masz punkt):

  • getRecipe(parsedRDF) -> zabiera przeanalizowany RDF (jako obiekt JavaScript) i mówi mi, jak używać to
  • createMeal(parsedRDF, recipe) -> zabiera przeanalizowany RDF i recepturę z góry i tworzy nowy obiekt RDF z niego
  • to nowy obiekt musi dostać szeregowane i przesyłane do przeglądarki
  • (w realnym świecie getRecipe Wil muszę wykonać interakcję użytkownika w przeglądarce)

Podoba mi się pomysł łączenia tego za pomocą rur dla większej elastyczności, gdy poprawię kod później. Ale nie chcę serializować go do serializacji RDF za każdym razem, ale po prostu wysłać wokół obiektu JS. Z tego, co przeczytałem w dokumentacji, mógłbym skorzystać z modułu stringify, aby uzyskać ciąg z każdego kroku, aby przeprowadzić go do następnego kroku. Ale:

  • czy to ma sens? Czy mogę dodać niepotrzebne obciążenie lub czy jest to pomijalne?
  • Nie widzę sposobu, w jaki mógłbym dać sparsowanyRDF dla obu metod z zależnością, że getRecipe musiałaby być wywołana jako pierwsza, a dane wyjściowe również dla createMeal. Czy są moduły, które mi w tym pomagają?
  • Możliwe, że muszę poprosić użytkownika o ostateczny wybór receptury, więc może potrzebować wysłać rzeczy do przeglądarki, aby uzyskać ostateczną odpowiedź. Czy mogę zrobić coś takiego przez gniazda, podczas gdy rura "czeka"?

Mam nadzieję, że to pokazuje, co próbuję zrobić, jeśli nie, postaram się podać więcej szczegółów/powtórzyć.

Aktualizacja: Po spanie nad nim zorientowali się jeszcze kilka rzeczy:

  • To chyba nie ma sensu do serializacji formatu RDF do czegoś podobnego niestandardowym jeśli istnieją oficjalne formaty serializacji.Więc zamiast używać stringify po prostu przekażę oficjalną serializację RDF pomiędzy krokami
  • Oznacza to, że parsuję/serializuje obiekty w każdym kroku i to z pewnością dodaje narzut. Pytanie czy mnie to obchodzi? Mogłem przedłużyć moduł RDF używać do analizowania ze strumienia i szeregować pod jednym
  • mogę rozwiązać problem z zależnością między getRecipe i createMeal poprzez dodanie pewnych informacji od getRecipe do parseRDF, można to zrobić bardzo łatwo z RDF bez zerwanie oryginalnego modelu danych. Ale chciałbym jeszcze się dowiedzieć, czy mogę obsłużyć zależności jak to z rur

Odpowiedz

5

Tak, to jest w porządku, aby strumień js obiektów po prostu trzeba pamiętać, aby rury to przez coś, co będzie serializacji przesyłaj strumieniowo ponownie po napisaniu go do IO.

ja polecam napisanie modułu o nazwie rdfStream który analizuje i serializes RDF, by go używać jak to

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. 

i może to być również wykorzystywane przez inne osoby pracujące z RDF w węźle, niesamowite!

+0

Dzięki za odpowiedź, rzeczywiście dodam obsługę rur do biblioteki RDF i udostępnię ją również jako moduł! –

Powiązane problemy