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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bul
    bul est déconnecté
    Membre confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    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 confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    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 confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    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 confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    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 confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    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 confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    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 !

+ 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