Tento web používá soubory cookie. Dalším používáním webu s tímto souhlasíte.
jméno
heslo
přihlásit
zaregistrujte se
zapomněli jste heslo?
node.js - Evented I/O for V8 JavaScript
ANGEL333
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
  • Máte k tomu co říct? Vložte se do diskuze.
    DARKIE --- 23:21:25 16.5.2017
    REFLEX: ja len ze je imho trochu semanticky nespravne aby this vnutri objektu runner ukazovalo na nieco ine ako runner

    ak chces vramci runnera bezat nieco z myobjectu tak by som to zapisal takto

    this.runner.run(this.another_function.bind(this));

    samozrejme si potrebujes naprototypovat v myobject another_function a nie pouzivat anonymous funkciu.

    takto sa nestratis ked budes v buducnosti ten kod ty alebo niekto iny citat
    UETOYO --- 17:18:13 13.5.2017
    GitHub - facebook/prepack: Prepack is a partial evaluator for JavaScript. Prepack rewrites a JavaScript bundle, resulting in JavaScript code that executes more efficiently.
    https://github.com/facebook/prepack
    FEDY --- 11:14:56 12.4.2017
    AREX: to je to co jsem prave napsal - jen 1x "worker_mysql: sending to main process" a nekolikrat "mod_subnets: received from SQL worker". bude to moje chyba asi ve zpracovani tech eventu ale nevim jaka
    AREX --- 11:01:02 12.4.2017
    FEDY: Tohle uz asi uplne nesouvisi s NodeJS :) S workery nemam zkusenosti, takze neporadim snad jen krome toho dat si logovani i tam kde to posilas jestli to opravdu je jenom jednou.
    FEDY --- 10:54:21 12.4.2017
    AREX: tak jsem dosel k tomu, ze to dela ta mapa (visjs) - stale jsem nevypnul fyziku a dokud se body neustali, tak to pocita jako vztekle. jakmile zazoomuju tak aby byly videt 2-3 body (asi to nejni tolik vytizene), violations zmizi ...

    ale, mam jeste jeden dotaz - v nodejs si vytvarim child procesy forkem. napr. pro mysql operace, aby mi to nezdrzovalo hlavni proces. doposud vse ok - select, insert, update, retez nekolika udalosti select a potom insert / update - vse ok. ale nyni jsem narazil - child process mi v logu pise, ze odesila data do hlavniho procesu (jednou) a hlavni proces zarve, ze data obdrzel nekolikrat - tedy jakoby se on event volal vicekrat (?) nedelam nejakou zasadni blbost ? nebo to delam cele spatne ?

    worker_mysql: Found 1 subnet in MYSQL.
    worker_mysql: sending to main process {"err":false,"sqlAction":"select","sqlTable":"subnet","rows":[{"id_subnet":1,"prefixSize":24,"network":"10.133.36.0","purpose":0,"id_node":-1}]}
    ^^^
    child process hlasi 1x odeslani

    ....ale hlavni proces nekolikrat prijeti....

    mod_subnets: received from SQL worker {"err":false,"sqlAction":"select","sqlTable":"subnet","rows":[{"id_subnet":1,"prefixSize":24,"network":"10.133.36.0","purpose":0,"id_node":-1}]}
    mod_subnets: subnet 10.133.36.0 exists in database
    mod_subnets: received from SQL worker {"err":false,"sqlAction":"select","sqlTable":"subnet","rows":[{"id_subnet":1,"prefixSize":24,"network":"10.133.36.0","purpose":0,"id_node":-1}]}
    mod_subnets: subnet 10.133.36.0 exists in database
    mod_subnets: received from SQL worker {"err":false,"sqlAction":"select","sqlTable":"subnet","rows":[{"id_subnet":1,"prefixSize":24,"network":"10.133.36.0","purpose":0,"id_node":-1}]}
    mod_subnets: subnet 10.133.36.0 exists in database
    mod_subnets: received from SQL worker {"err":false,"sqlAction":"select","sqlTable":"subnet","rows":[{"id_subnet":1,"prefixSize":24,"network":"10.133.36.0","purpose":0,"id_node":-1}]}
    mod_subnets: subnet 10.133.36.0 exists in database


    hlavni proces vola child takto
     global.sql.worker.send(request);
                    global.sql.worker.once('message', function(resp) {
                        console.log(_Fname+': received from SQL worker '+JSON.stringify(resp));
                        if (resp.err == false && resp.sqlTable == 'subnet' && resp.sqlAction == 'select') {
                            if (resp.rows.length === 0) {
                                console.log(_Fname+': subnet does not exist in database');
                                var insertRequest = [{sqlAction: 'insert', sqlTable: 'subnet', network: subnet.networkAddress, prefixSize: subnet.subnetMaskLength,  purpose: purpose, id_node: router }];
                                global.sql.worker.send(insertRequest);
                                return
                            } else {
                                console.log(_Fname+': subnet '+resp.rows[0].network+' exists in database');
                                return
                            }
                        }
                    });
                    global.sql.worker.once('message', function(resp) {
                        if (resp.err == false && resp.sqlTable == 'subnet' && resp.sqlAction == 'insert') {
                            console.log(_Fname+': subnet inserted with ID '+resp.insertId);
                            return
                        }
                    }); 

    --------------------------------------------------

    a child odpovida takto
     process.on('message', function(data) {
        console.log('worker_mysql: rececived data '+JSON.stringify(data));
        var table = data[0].sqlTable;
        var action = data[0].sqlAction;
        delete data[0].sqlTable;
        delete data[0].sqlAction;
    
        switch(action) {
    
            case "select":
    
                select(table,data,function(err,table,rows) {
                    if (err) {
                        var result = { err: true, sqlAction: action, sqlTable: table, rows: null };
                    } else {
                        var result = { err: false, sqlAction: action, sqlTable: table, rows: rows };
                    }
                    console.log('worker_mysql: sending to main process '+JSON.stringify(result)+'');
                    process.send(result);
                    return
                });
            break;
    
            case "insert":
    
                insert(table,data,function(err,insertId,dataOut) {
                    if (err) {
                        var result = { err: true, sqlAction: action, sqlTable: table, insertId: null, object: null };
                    } else {
                        var result = { err: false, sqlAction: action, sqlTable: table, insertId: insertId, object: dataOut };
                    }
                    console.log('worker_mysql: sending to main process '+JSON.stringify(result)+'');
                    process.send(result);
                    return
                });
    
            break;
    
            case "update":
    
            break;
            default:
    
            break;
    
        } 


    nevim proc, ale NYX nejak zkomolil ten zdrojak :-) snad tomu je rozumnet...
    AREX --- 11:28:59 28.3.2017
    FEDY: Nevim cim kreslis to co tam kresleny, ale skoro bych hledal zdroj problemu tam. Vsadim, ze cele to vykresleni je synchronni zalezitost a jestli to delas primo v reakci na prijata data, tak je o to horsi.

    Obecne neni dobre na udalosti (tedy i prijata data) reagovat okamzite. Naopak by sis mel jen ty data ulozit do nejake promenne. A pak pouzij `requestAnimationFrame`, ktery by cist naposledy prijata data a vykresli to podle nich. Ta funkce ti rika, kdy je nejoptimalenejsi neco vykreslovat.
    AREX --- 11:25:17 28.3.2017
    FEDY: "Handler took 504ms of runtime" ... to samo o sobe ti rika, ze dlouho trvalo zpracovani dat, ktere jsi prijal pres Socket.io. Pojem handler znamena obvykle funkce/callback, ktera reaguje na nejakou udalost.

    Jinak doporuju si v browseru dat socket.io do blackboxu, pak ti to melo ukazovat trochu uzitecnejsi informace. https://developer.chrome.com/devtools/docs/blackboxing
    FEDY --- 10:37:29 28.3.2017
    AREX: cili myslis, ze to blokuje neco, co je volano pri prichozich datech ? me to uplne neprijde, obzvlast kdyz jsem si prohledl profiler - same funkce ze socket.io

    [https://i.nyx.cz/files/00/00/16/87/1687738_6267f8d4aa9b49230c6c.jpg?name=JS_long_running.jpg]
    AREX --- 8:33:01 28.3.2017
    FEDY: Nerekl bych, ze ta chyba souvisi se SocketIO. Tohle znamena, ze ta bezi nejaky synchronni skript, ktery je bud extremne pomaly a nebo nikdy neskonci. Castym zdrojem jsem neukoncene rekurzivni smycky. SocketIO komunikace je asynchronni a nemuze tedy browser blokovat ani kdyby chtelo :)
    FEDY --- 7:55:59 28.3.2017
    ahoj,

    jsem v javascriptu a nodejs zacatecnik, tedy prosim o shovivavost - pisu dohledovy system pro nasi sit (ping, snmp, syslog atp) a narazil jsem na knihovne SocketIO v prohlizeci - jakmile mam prilis objektu, zacnou se objevovat violations "script took too long time" atp. mate nekdo predstavu, jak to resit ? nahradit SocketIO treba za EngineIO ? nebo jeste neco jineho ?

    predem diky