• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    ANGEL333node.js - Evented I/O for V8 JavaScript

    Věříte, že nějaký webapp framwork postavený na node.js (Express?) bude v budoucnosti rozšířený podobně jako jsou nyní např. Django, CakePHP, Rails, Zend, atd..?

    55 hlasy od 55 respondentů

      Relativně nové server-side javascriptové API. Hlavní předností je, že je event-driven a neblokující. Již nyní obsahuje implementaci protokolů HTTP, TCP, DNS, rozhraní pro práci s procesy, soubory, atd..

      Instalace je velmi jednoduchá, jediná závislost je Python, potom node.js nainstalujete jako standardní program.

      Odkazy:


    • Oficiální web: http://nodejs.org

    • Přednáška od Ryana Dahla (autor node.js)

    • Git repozitář: http://github.com/ry/node
    • rozbalit záhlaví
      QUIP
      QUIP --- ---
      SH_PANDA:
      "start": "node -r dotenv/config dist/index.js",
      prestart a poststart tam vubec neni.

      Ve VM jsem si udelal omezene prostredi s puvodni verzi node a npm a tam to po spusteni vypadalo takhle

      |-+= 05246 www daemon: env[5247] (daemon)
      | \-+- 05247 www node: npm start graphql_acc (node)
      |   \--- 05248 www node -r dotenv/config dist/index.js graphql_acc
      PID zapsany do pidfile souhlasi s tim druhym procesem = 5247

      Pak jsem udelal pkg upgrade, takze se npm a node zaktualizoval na tu verzi 8.19.1 a 16.16.0, spustil jsem sluzbu a uz nesla restartovat, protoze tam chybi ten druhy proces:
      |--= 05526 www daemon: env[5527] (daemon)
      |--- 05528 www node -r dotenv/config dist/index.js graphql_acc

      Upravil jsem ten rc skript, aby se nevolal npm start, ale z promenne v rc.conf se vytahne libovolni prikaz v nodesvc_cmd a ten se spusti primo volanim /usr/local/bin/node
      procname="/usr/local/bin/node"
      command="/usr/sbin/daemon"
      command_args="-f ${nodesvc_logopt} -t ${nodesvc_title} -p ${pidfile} ${nodesvc_npmenv} ${procname} ${nodesvc_cmd} ${node_flags}"

      Takze upraveny rc skript funguje a v aplikaci se nic zmenit nemuselo.

      Jeste tam jsou trochu upravene parametry pro daemon, takze mam navic logovani do souboru a nazev instance viditelny ve vypisu procesu:
      |-+= 05707 www daemon: nodesvc:graphql_acc[5708] (daemon)
      | \--- 05708 www /usr/local/bin/node -r dotenv/config dist/index.js -n graphql_acc

      Sezralo to strasne moc casu, na to, ze to je zpusobene jen obycejnym update npm, ale aspon ze uz to mam na par let z krku, nez se zase neco podobneho rozbije jinou aktualizaci.
      SH_PANDA
      SH_PANDA --- ---
      QUIP: meh. chapu. a co maji v package.json scripts.start | prestart | poststart?
      QUIP
      QUIP --- ---
      SH_PANDA: Changelogy jsem zkousel projizdet jak u node, tak npm, ale nic relevantniho nenasel - jen jsem si nebyl jistej, ze mi neuniklo neco pod mym radarem, jak to nesleduju nijak pravidelne.
      Problem daemona to neni, protoze ten se nezmenil, ten je porad stejny a jak jsem psal, tak tohle reseni fungovalo radu let. Muselo se tedy zmenit neco ohledne toho, jak npm spousti ten vlastni node proces.
      Na jinem projektu u jineho klienta se pouziva yarn a tam se to spousti taky pres daemon a funguje to porad stejne. (akorat se misto npm start vola nejaky yarn prikaz)

      No taky by mi prislo lepsi vynechat to volani "npm start", ale to uz musim resit s vyvojarema te aplikace. To spousteni pres npm start byl pred lety jejich pzoadavek.
      SH_PANDA
      SH_PANDA --- ---
      QUIP: neni to spis problem toho daemonu? inac produkcni kod bych pres npm start nepoustel a tim by odpadl problem co se stalo v npm. v nodejs se IMHO mezi 16.15.1 a 16.16.0 nic co by melo na tohle dopad nestalo. (https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V16.md#16.16.0)
      QUIP
      QUIP --- ---
      Mam takovy problem se spoustenim / ukoncovanim node aplikace.
      Vec, ktera nekolik let fungovala prestala fungovat po nedavne aktualizaci node a npm.
      Aplikace se na FreeBSD serveru spousti rc skriptem, ktery obsahuje tuhle klicovou cast (shell script)
      procname="/usr/local/bin/node"
      command="/usr/sbin/daemon"
      command_args="-f -p ${pidfile} ${nodesvc_npmenv} npm start ${node_flags}"

      Spusteni "funguje" porad, ale uz to pres rc skript nejde ukoncit, nebo restartovat. Problem je v tom, ze do pidfile se zapise PID prikazu, ktery teprve forkne child proces te node aplikace, takze v pidfile je pak PID procesu, ktery uz neexistuje, respektive kratce po spusteni aplikace je prikazem ps videt jako <defunct> a pak tenhle zombie proces zmizi.

      |-+= 03119 www daemon: env[3120] (daemon)
      | \--- 03120 www <defunct>
      |--- 03121 www node -r dotenv/config dist/index.js test_graphql

      V pidfile je PID 3120

      Jelikoz nikde nebezi funkcni verze, tak nevim, jak by mel ten strom procesu vypadat spravne. Jestli to puvodne bylo takhle

      |-+= 03119 www daemon: env[3120] (daemon)
      | \--- 03120 www node -r dotenv/config dist/index.js test_graphql
      Nebo na te pozici toho nynejsiho <defunct> byl nejaky jiny node proces, ktery teprve spoustel node -r dotenv/config dist/index.js test_graphql.

      Ten command daemon je tam kvuli presmerovani stdin + stdout + stderr (obdoba toho, kdyby se pouzilo "npm start &", ale umi to jeste par dalsich veci)

      Uz jednou se v node.js / npm neco zmenilo, ze se v rc skriptu musel zmenit procname="/usr/local/bin/npm" na procname="/usr/local/bin/node", protoze ten proces ve vypisu ps se uz nejmenoval npm, ale node a identifikace procesu pro stop / restart se neprovadi jen matchnutim PID z pidfile, ale zaroven porovnanim jmena prikazu (musi sedet interpretr), aby nekdo nepodvrhnul v jine sluzbe PID nejakeho systemoveho procesu)

      A ted tedy ke konkretnimu dotazu - sledujete nekdo vyvoj node.js a npm tak peclive, ze byste me dokazali nasmerovat, kde a kdy doslo k nejake zmene, ktera ovlivnuje tohle chovani?
      Da se nejak vynutit zpatky to puvodni chovani, kde tam zustal i ten proces, ktery je primym potomkem "daemon" a jehoz PID se zapise do pidfile?

      Resim to z pohledu sysadmina, tedy pouze se staram o to, aby aplikace / sluzby bezely, nejsem koder te aplikace, takze stourat do toho, ze by se poustela jinak je trochu slozitejsi (to nemuzu udelat ja, to musi udelat nekdo jiny).

      Jelikoz to pravdepodobne prestalo spravne fungovat po upgrade, ktery probehl v prosinci, mam k tomu jeste info o zmenach verze node a npm:
      node16 upgraded: 16.15.1 -> 16.16.0
      npm upgraded: 8.5.2 -> 8.19.1

      Takze nekde mezi verzi npm 8.5.2 -> 8.19.1 a nebo mezi node verzi 16.15.1 -> 16.16.0 se zmenilo neco, co minimalne od roku 2018 fungovalo.
      KOC256
      KOC256 --- ---
      OK, díky všem...
      SUK
      SUK --- ---
      KOC256: Jak pisou dva predrecnici, docker, pm2 nebo systemd a ja nad to cely hodim apache/nginx jakozto reverzni proxy (mimojine kvuli SSL a letsencrypt).

      A jelikoz byva nazor, ze vec v node by nemela sledovat jinou vec v node, tak asi ten systemd (pokud nepouzivas dockre)
      FEDY
      FEDY --- ---
      KOC256: v linuxu pomoci systemd - kdyz daemon spadne, znovu jej umi nahodit s urcenym delay
      B3DA
      B3DA --- ---
      KOC256: docker / pm2
      KOC256
      KOC256 --- ---
      Předesílám, že problematice vůbec nerozumím a moc ani nevím jak hledat, abych nedostal až moc lowlevel info... Chtěl bych to spíše tak nějak polouživatelsky...

      když mám v Node.js vytvořenou aplikaci "server.js" (var app = express();), tak ji spustím jako takto:
      cd /var/www/node/
      /usr/bin/npm start &
      To jsem někde okoukal v tutoriálu...

      Ale to mi přijde takové humpolácké. Jsem zvyklý na to jak to funguje na PHP hostinzích, kde neřeším žádné spouštění atd. Mám prostě přidělený nějaký prostor, kde když nahraju PHP soubory, tak se umí interpretovat.

      Chápu, že ten express je asi na úrovni Apache (ala PHP) ale i ten běhá jako služba, která si sama řeší svoje udržování při životě atd.
      V Node.js aplikaci se mi občas něco zasekne a pak to visí až do restartu, který cronem vynucuji 2x denně.

      Nevím zda je zřejmé na co se ptám, ale pokud jo, tak budu vděčný za odpověď či nasměrování...
      OODOOW
      OODOOW --- ---
      KOC256: z téhle https://m.facebook.com/pg/bambubarbirmingham/events/ stránky. Potřebuju stáhnout ten obrázek, je to nějaký CSS escapování. No, zatím jsem prostě dal replace a budu doufat, že se tam žádnej další znaky neobjeví, ale klidnější bych byl s nějakou knihovnou.
      KOC256
      KOC256 --- ---
      OODOOW:
      odkud je ten vrchní string?
      protože "=" se v url escapuje jako "%3D" ale ty tam máš "\3d ".

      To si leda pro těch pár znaků napsat...
      OODOOW
      OODOOW --- ---
      Zdravím, věděl by někdo o knihovně, co by dovedla převést tohle:

      https\3a //scontent-prg1-1.xx.fbcdn.net/v/t1.6435-9/fr/cp0/e15/q65/59692487_2178790175575066_6541625750364094464_n.jpg?_nc_cat\3d 111\26 ccb\3d 1-5\26 _nc_sid\3d ed5ff1\26 efg\3d eyJpIjoidCJ9\26 _nc_ohc\3d 1Ibooh7jC0sAX-zLQP0\26 _nc_ht\3d scontent-prg1-1.xx\26 oh\3d fb748bd94267f69cf842739b80adfd03\26 oe\3d 61CBA604


      na tohle:
      https://scontent-prg1-1.xx.fbcdn.net/v/t1.6435-9/fr/cp0/e15/q65/59692487_2178790175575066_6541625750364094464_n.jpg?_nc_cat=111&ccb=1-5&_nc_sid=ed5ff1&efg=eyJpIjoidCJ9&_nc_ohc=1Ibooh7jC0sAX-zLQP0&_nc_ht=scontent-prg1-1.xx&oh=fb748bd94267f69cf842739b80adfd03&oe=61CBA604


      Nějak nemůžu najít nic, co by dokázalo unescapovat ty znaky.
      GDY
      GDY --- ---
      FEDY: a máš pro používání tříd nějaký reálný opodstatnění, nebo se ti prostě jen líbí, jak se zapisují? :) Classy v JS totiž nejsou nic jinýho než "hezky" zapsaný funkce, V8 si to beztak interně převede na prototypy a pak je tedy vhodný si "našprtat" jak to s těma prototypama je. Osobně jsem od tříd úplně upustil, protože to kód imo akorát zbytečně komplikuje. OOP návrhový vzory se daj při troše snahy dělat i funkcionálně. Třídy montujou dohromady vrstvu datovou a vykonávající. S funkcionálním přístupem tohle odpadá - zbyde prostě jen čistě datový objekt a něco, co ho modifikuje, nic dalšího přeci není potřeba.
      FEDY
      FEDY --- ---
      SUK: arrow function je to co potrebuju ! :-) doposud jsem myslel, ze je to jen zkraceni syntaxe. closures uz jsem snad i nejednou cetl a nejak jsem to nepochopil - budu muset zkusit znovu :-D diky za rady a tipy ke studiu !!
      to celkem i vyresilo muj predchozi problem s "knihovnou" funkci. nevim jestli jde class xxx extends yyy take s funkcema, ale kdyz jsem si to prepsal na tridy a pouzil extends, splnilo to co jsem potreboval :-)
      SUK
      SUK --- ---
      FEDY: tady je toho vic. Doporucuju precist, jak funguje prototypovy a jak "standardni" OOP. Dale doporucuji ke studiu closures, ktere vysvetli ono "self" a pak na zaver to, co realne potrebujes, tedy arrow functions, ktere "zachovavaji" this u callbacku, tedy on("msg", (data) => { this.doSomethingWith(data); }); bude fungovat. Jo a vlastne jeste by se mohlo hodit bind v pripade, ze budes touzit pouzit neco jako on("msg", this.processMessage)
      FEDY
      FEDY --- ---
      ahoj,

      mel bych prosim jeste jednu - rad bych zacal definovat tridy jako class namisto function , ale nejak plavu ve scopech (jestli to nazyvam spravne). jak pristupovat k vlastnostem tridy z napr. on eventu ?

      ...zde je pri zprave od workeru vzdy this.file undefined (var self = this v constructoru, tak jako ve funkci nejde)
      class Service {
      
          constructor(file) {
              this.file = file;
              this.worker = null;
              console.log('new Service ('+file+') created');
          }
          start() {
              this.worker = ChildP.fork(this.file);
              this.worker.on('message', function(data) {
                  console.log('received message from Service ('+this.file+')');
              })
          }
      }
      var service = new Service('worker');
      service.start();
      


      ovsem kdyz to napisu nasledovne, tak to funguje ....

      function Service(file) {
      
          this.file = file;
          this.worker = null;
          var self = this;
          console.log('new Service ('+file+') created');
      
          this.start = function() {
              this.worker = ChildP.fork(this.file);
              this.worker.on('message', function(data) {
                  console.log('received message from Service ('+self.file+')');
              })
          }
      }
      var service = new Service('worker');
      service.start();
      
      FEDY
      FEDY --- ---
      SUK: asi jsem to spatne nazval. jsou to funkce ciste pro tu moji appku. mam core proces a u nej nekolik child procesu (workeru). ty childy maji shodne funkce za ucelem komunikace skrz core proces mezi sebou. a kdyz tu komunikacni funkci upravim, nechci ji udrzovat ve vsech childech.
      SUK
      SUK --- ---
      FEDY: knihovna s funkcema, ktera hybe vecma "nad" mi nezni zrovna jako knihovna s funkcema ale neco pomerne tesne navazany na zbytek appky. Knihovna s funkcema je neco, co presunes do jinyho projektu a dal to funguje - prave proto, ze to nepotrebuje hybat nicim jinym. Nevim ovsem, co presne zamyslis. Kazdopadne, mas nasledujici moznosti:

      1. predavat funkcim objekt a ten modifikovat
      2. pouzivat za timto ucelem callbacky
      3. IOC
      FEDY
      FEDY --- ---
      ahoj vsem,

      rad bych mel knihovnu s funkcema , kterou bych chtel pouzit ve vicero scriptech (child procesech). coz bych mohl pomoci modulu, ovsem potrebuju z modulu pristupovat k promennym a funkcim zpet nahoru z "parent" scriptu. jde to pomoci global, ale to se mi nejak nelibi. dokaze mi nekdo poradit ? (neni nutne to delat pomoci modulu a require, pokud je jina moznost)

      parent.js
      require("./module.js")();
      const promenna = "parent";
      
      test();      // test

      module.js
      module.exports = function() {
      
        this.test = function() {
          console.log('test'); 
        }
      
        console.log(promenna);     // undefined
      
      }

      Jak to udelat ?
      KOC256
      KOC256 --- ---
      AREX:
      ukládám si, zkusím díky...
      Kliknutím sem můžete změnit nastavení reklam