IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

node avec [Express][Ejs] erreur si navigateur déjà lancé


Sujet :

NodeJS

  1. #1
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut node avec [Express][Ejs] erreur si navigateur déjà lancé
    bonjour à tou.te.s

    j'utilise Express et Ejs, et tout fonctionne nickel
    linux manjaro, en local
    mais ( ben oui, sinon je ne serais pas là )
    si le navigateur ( n'importe lequel ) est déjà actif
    et ce, quel que soit le port utilisé,
    une erreur se produit :
    Unable to connect
    can’t establish a connection to the server at localhost:13579.
    The site could be temporarily unavailable or too busy. Try again in a few moments.
    If you are unable to load any pages, check your computer’s network connection.
    If your computer or network is protected by a firewall or proxy, make sure that Waterfox is permitted to access the Web.

    edit : oubli de l'extrait de la source

    run.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const proenf=require('child_process');
    const ejs=require('ejs');
    const app=require('express')();
    app.engine('html',ejs.renderFile);
    app.set('views',__dirname+'/');
    const hote='localhost', port=12345;
    app.listen(port,hote,
        function() { proenf.exec(    'xdg-open http://'+hote+':'+port,
                                    function() { process.exit(); });});
    app.get('/',function(requete,reponse) {
                        reponse.render(    'main.html', { 'repapp':__dirname } );});
    main.html
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!DOCTYPE html>
    <html lang='fr'>
        <head>
            <title>main.html</title>
            <meta charset='utf-8'>
        </head>
        <body>
            répertoire de l'application : <%=repapp%>
        </body>
    </html>

    je fais quoi comme bétise ?

    merci d'avance

  2. #2
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut explication
    je réexplique car peut-être pas très clair !

    ° 1er essai
    rien n'est lancé
    je lance run.js avec node
    qui charge donc le navigateur par défaut qui exécute
    main.html (pour afficher le répertoire courant)
    tout baigne

    ° 2ème essai
    ( on ferme/arrête tout du 1er essai )
    je lance le navigateur par défaut
    je lance run.js avec node
    erreur affichée dans le navigateur

    s'il vous faut plus d'infos...

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Je n’ai pas de réponse, mais je vais essayer de faire avancer les choses en posant une question. Quel est le but de l’instruction process.exit() dans ta fonction app.listen() ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    à arrêter le serveur run.js quand on ferme la page html main.html
    mais bon... ça ne joue pas dans l'histoire, si ?
    @+
    EDIT : ben si !?!
    sans process.exit(), un onglet est bien
    ouvert dans le navigateur !?!

    comprend pas

    alors, comment "sortir" de run.js quand on "ferme" main.html alors ?
    suite : peut-être en récupérant la fermeture de l'onglet ou de
    la fenêtre et d'appeler avec ajax une fonction dans run.js qui
    fera ce process.exit() ?
    je fais cela dans une autre appli en cliquant sur un bouton "fermeture"
    il me reste à détecter la fermeture de l'onglet ou de la fenêtre
    si ça fontionne avec tous les navigateurs !

  5. #5
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    un petit appel ajax dans 'beforeunload' de addEventListener
    semble convenir
    je pense qu'on va pouvoir mettre résolu
    merci encore, c'était la bonne question à priori

    mais, si vous avez une solution meilleure....

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par bul Voir le message
    un petit appel ajax dans 'beforeunload' de addEventListener
    Ça me paraît une bonne solution. En fait, ton problème venait surtout du fait que les échanges entre le client (navigateur) et le serveur (script Node) sont des échanges asynchrones. Généralement, dans une architecture web classique, on part du principe que le serveur tourne en permanence, et que les clients font leur vie ; d’ailleurs les clients sont le plus souvent sur d’autres machines.

    Dans ton cas, nous avons un appel proenf.exec qui lance un processus xdg-open, qui lui-même invoque Waterfox. Je ne sais pas exactement ce qui se passe dans les entrailles de Waterfox d’un point de vue processus, mais il y a fort à parier qu’il engendre plusieurs processus ou threads enfants, puis qu’il s’arrange pour rendre la main au processus parent le plus tôt possible. On a alors deux cas de figure :

    1. Waterfox n’est pas encore lancé, et alors il va prendre un certain temps pour s’initialiser. Ce n’est que mon hypothèse, mais je pense qu’il se donne le temps d’envoyer une requête HTTP GET à ton serveur avant de signaler à xdg-open qu’il a fini de se lancer, et donc avant que xdg-open signale à ton serveur Node qu’il a fini son boulot, et donc avant que proenf.exec invoque la fonction de rappel que tu lui as passée et qui contient l’instruction exit.
    La requête GET est reçue par ton serveur et gérée par la route app.get('/', ...).

    2. Waterfox est déjà lancé, et dans ce cas xdg-open le détecte et renvoie un code de succès quasiment tout de suite. Waterfox reçoit tout de même l’URL, mais le temps d’envoyer la requête, le serveur a déjà exécuté l’instruction exit, et donc il ne tourne plus.

    Un tout petit détail : il y a deux évènements différents, 'beforeunload' et 'unload', qui signalent la fin de vie d’une page. 'beforeunload' permet de donner une chance à l’utilisateur ou utilisatrice d’annuler l’action de quitter la page avec un message du style « attention, des données non sauvegardées pourraient être perdues ». Dans ton cas, tu n’as pas besoin de ça, tu peux donc utiliser 'unload'. Certains navigateurs actuels ou futurs pourraient utiliser cette connaissance pour optimiser le déchargement de la page.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut zut... réponse perdu

    merci encore pour toutes ces explications !

    ça se produit avec tous les navigateurs ( enfin ceux avec qui j'ai testé !
    firefox, falkon, waterfox,chrome...)

    et "petit bémol" avec ce que je fais :
    le on[before]unload n'est déclenché que si
    plusieurs onglets sont actifs !?!
    run.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    const proenf=require('child_process');
    const ejs=require('ejs');
    const app=require('express')();
    app.engine('html',ejs.renderFile);
    app.set('views',__dirname+'/');
    const hote='localhost', navigateur='falkon', port=12345;
    var server=app.listen ( port,hote,
        function() {
            console.log('listen');
            proenf.exec(
                navigateur+' http://'+hote+':'+port,
                function() { }
            );
        }
    );
    app.get('/',
            function(requete,reponse) {
                console.log('get /');
                reponse.render(    'main.html', { 'repapp':__dirname } );
            }
    );
    app.get('/exit',
        function(requete,reponse) {
            console.log('exit');
            process.exit();
        }
    );
    main.html
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <!DOCTYPE html>
    <html lang='fr'>
        <head>
            <title>main.html</title>
            <meta charset='utf-8'>
        </head>
        <body>
            répertoire application : <%=repapp%>
            <script>
                function Ajax(url,retour) {
                     var xml=new XMLHttpRequest();
                    xml.onreadystatechange=function() {
                         if ( xml.readyState==4 ) { retour(xml.responseText); }
                    };
                    xml.open('get',url,true);
                    xml.setRequestHeader(     'Content-type',
                                            'application/x-www-form-urlencoded');
                    try {    xml.send();
                        } catch (e) {
                             retour('XmlHttpRequest erreur envoi : '+e);
                    }
                }
                document.body.onbeforeunload=function(event) {
                    Ajax( '/exit', function(retour) { },true );
                    event.preventDefault();
                    event.returnValue='fin';
                    return true;
                };
            </script>
        </body>
    </html>

    tenté de nombreuses "variantes" coté client et serveur
    avec toujours le meme résultat

    main.html
    addeventlistener, onbeforeunload ou onunload
    appel ajax et retour true ou false ou rien
    event.preventDefault et .returnValue er return ou pas
    ou mis dans le "retour" d'ajax...

    j'aimerais bien comprendre, aller au bout

  8. #8
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    J’ai regardé un peu, apparemment c’est compliqué de détecter de façon fiable la fermeture du navigateur. Je pense que notre meilleure chance est d’écouter l’évènement pagehide. Les évènements 'pageshow' et 'pagehide' sont liés à une session d’historique et aux boutons précédent / suivant. J’ai fait quelques tests et il semble que les navigateurs n’envoient pas toujours 'unload' quand on les ferme, partant du principe que la session pourrait être restaurée à la réouverture.

    On doit recourir à une bidouille sale : l’ajax synchrone, une requête ajax qui gèle le navigateur le temps d’obtenir la réponse. C’est le seul moyen de retarder la fermeture du navigateur afin qu’il maintienne ses fonctions le temps de faire parvenir un signal au serveur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function Ajax(url, retour) {
      const xml = new XMLHttpRequest();
      xml.onload = function () {
        retour(xml.responseText);
      };
      xml.open('GET', url, false); // requête synchrone
      xml.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      try {
        xml.send();
      } catch (e) {
        retour('XmlHttpRequest erreur envoi : ' + e);
      }
    }
     
    window.addEventListener('unload', function () {
      Ajax('/exit', function (retour) {}, true);
    });
     
    window.addEventListener('pagehide', function () {
      Ajax('/exit', function (retour) {}, true);
    });
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #9
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    un pas de plus vers la résolution...
    mais pas suffisant
    à priori, tel quel, ça ne change rien

    je crois que j'avais déjà tenté ajax sybchrone
    je connaissais pas pagehide

    peut-être un settimeout pour valider
    la fin des requètes ajax ?

    dès que possible j'essaie et je vous dit ce qu'il en est

    EDIT : avec settimeout ( coté serveur ou client ) c'est pire !
    même avec plusieurs onglets, ça en fonctionne plus
    avec le navigateur falkon

    avec firefox, la solution proposée
    ( sans settimeout ) fonctionne !

    je vais tester avec d'autres navigateurs


    @+

  10. #10
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    ça fonctionne avec
    firefox
    waterfox classic
    waterfox g3
    par contre pas avec
    falkon
    opera
    vivaldi
    chrome
    pas testé d'autres navigateurs

    je crains d'être obligé de me contenter de cela !
    s'il n'y a pas d'autres pistes, on considerera
    que, grâce à vous, c'est résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/02/2010, 13h58
  2. PB AVEC UTL_FILE.PUT (ERREUR UTL_FILE.WRITE_ERROR)
    Par satanas dans le forum Oracle
    Réponses: 10
    Dernier message: 25/07/2005, 08h41
  3. Réponses: 2
    Dernier message: 18/07/2005, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo