Partage

Cours Node.js : c'est parti !

7 décembre 2016 à 0:49:11

Bonsoir !

J'ai décidé de commencer à apprendre Node.js

Une fois je l'ai téléchargé depuis le site officiel, je tombe sur un bel écran noir juste après de son exécution. 

Qu'est ce qu'il faut vérifier avant de lancer l'exécutable?

Merci d'avance

8 décembre 2016 à 6:45:45

Tu dois vérifier que la version téléchargée est compatible avec ton système d'exploitation ....

Qu'est-ce que tu appelles un écran noir ?

13 décembre 2016 à 13:19:52

Salut à tous (et à toutes...),

Je suis actuellement occupé à essayer de bien assimiler le "SuperChat" du cours sur NodeJs.

A priori, mon code est quasi similaire en tous points à celui du cours mais au lieu du texte entré dans le champ message du formulaire, j'ai ce texte qui s'affiche : "function (e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}"

Au départ, ce texte ne s'affichait pas sur le chat d'autres participants mais j'ai résolu le problème en ajoutant des guillemets pour avoir :

var message = $('#message').val + "";

J'ai ensuite essayé d'insérer des console.log un peu partout pour voir au fur et à mesure comment était formaté la variable 'message'.

Sans grand succès...

A mon avis, le problème vient de mon formulaire :

<form action="/" method="post" id="formulaire_chat">
      <input type="text" name="message" id="message" placeholder="votre message..." size="50" autofocus />
      <input type="submit" id="envoi_message" value="Envoyer" />
</form>

Ou de l'encodage :

<meta charset="utf-8" />

ou des mises à jours des modules :

"dependencies": {
    "express": "~4.14.0",
    "socket.io": "~1.7.1",
    "ent": "~2.2.0"
}

Quelqu'un aurait une idée ou un conseil avisé ?

D'avance merci à tous (et toutes...) !

François




-
Edité par Advitamaeternam 13 décembre 2016 à 13:20:56

14 décembre 2016 à 6:46:38

Bonjour,

Si ton code est similaire à celui du cours, il devrait avoir le même comportement, si ce n'est pas le cas, l’hypothèse la plus probable est que ça vient des différences.

Poste ton code, et on pourra te dire ce qu'il en est.

15 décembre 2016 à 13:03:59

Effectivement, c'est de la logique pure... :D

A force de repasser sur le correctif pour trouver d'où ça vient, j'ai finalement un code qui devrait être complètement similaire...

Voici le code:

app.js

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var ent = require('ent');
var fs = require('fs');

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/index.html');
});

io.sockets.on('connection', function(socket, pseudo) {

  socket.on('nouveau_client', function(pseudo) {
    pseudo = ent.encode(pseudo);
    socket.pseudo = pseudo;
    socket.broadcast.emit('nouveau_client', pseudo);
  });

  socket.on('message', function(message) {
    message = ent.encode(message);
    socket.broadcast.emit('message', {pseudo: socket.pseudo, message: message});
  });

});

server.listen(8080);

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Super Chat d'entrainement !</title>
    <style>
      #zone_chat strong {
        color: white;
        background-color: black;
        padding: 2px;
      }
    </style>
  </head>

  <body>

    <h1>Super Chat d'entrainement !</h1>
    <form action="/" method="post" id="formulaire_chat">
      <input type="text" name="message" id="message" placeholder="votre message..." size="50" autofocus />
      <input type="submit" id="envoi_message" value="Envoyer" />
    </form>

    <section id="zone_chat">

    </section>

    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>

    <script>

      var socket = io.connect('http://localhost:8080');

      var pseudo = prompt('Quel est votre pseudo ?');
      socket.emit('nouveau_client', pseudo);
      document.title = pseudo + ' - ' + document.title;

      socket.on('message', function(data) {
        insereMessage(data.pseudo, data.message);
      });

      socket.on('nouveau_client', function(pseudo) {
        $('#zone_chat').prepend('<p><em>' + pseudo + ' a rejoint le chat !</em></p>');
      });

      $('#formulaire_chat').submit(function () {
        var message = $('#message').val + "";
        socket.emit('message', message);
        insereMessage(pseudo, message);
        $('#message').val('').focus();

        return false;
      });

      function insereMessage(pseudo, message) {
        $('#zone_chat').prepend('<p><strong>' + pseudo + '</strong> ' + message + '</p>');
      };

    </script>

  </body>
</html>

package.json

{
  "name": "superchat",
  "version": "0.1.0",
  "dependencies": {
    "express": "~4.14.0",
    "socket.io": "~1.7.1",
    "ent": "~2.2.0"
  },
  "author": "xxx",
  "description": "xxx"
}

Merciii



-
Edité par Advitamaeternam 15 décembre 2016 à 13:06:30

21 décembre 2016 à 20:38:38

Bonjour,

Je débute justement ce tuto.

Une question au sujet de la partie traitant de "socket.io" :

Qu'est-ce que c'est que le "io" dans "io.connect('http://localhost:8080')" dans le fichier index.html ?

Juste avant, il y a un script via lequel on charge le fichier socket.io.js :

<script src="/socket.io/socket.io.js"></script>

D'où sort ce "io" ?

21 décembre 2016 à 21:20:57

Bonsoir,

Pour faire simple, c'est un objet JS créé par le fichier socket.io.js chargé ligne 11, et qui est stocké dans la variable globale io.

Si ça peut t'aider ...

Cdt

-
Edité par a5er 21 décembre 2016 à 21:21:57

21 décembre 2016 à 21:23:12

Ok, merci pour ta rapidité.

Mais comment connaît-on alors toutes les variables que l'on peut exploiter via ce fichier ?

22 décembre 2016 à 6:40:49

Comme disent les programmeurs : RTFM.

Traduction : en lisant la documentation fournie par le développeur de l'outil.

Pour socket.io, c'est par là http://socket.io/docs/#

22 décembre 2016 à 12:33:49

C'est exactement ce que j'ai fait ce matin.

Merci de ton aide !

:-)

27 décembre 2016 à 19:01:38

Bonjour,

Je suis le cours node.js . Après installation de node sur mon  windows je démarre mon  premier programme node.js. Cependant, je dois créer un  fichier et l'ouvrir avec node.js. Et quand je tape vim plus le nom de mon   nv fichier,  j'ai droit toute suite à cette erreur suivante  dans la console :

'vim n'est pas reconnu  en  tant que commande.... '

Pareil pour la commande touch ....

Quelle est la solution svp? 

Rappel je suis sur windows.

Apprendre pour être heureux!
27 décembre 2016 à 22:01:01

Bonjour,

Tu as toi même répondu à ta question : tu es sur Windows.

La "console" Windows dispose de commandes différentes de celles dont tu as l'habitude sur Linux ou Mac et il n'y a PAS vim installé par défaut.

Si tu veux utiliser vim, tu as le choix entre l'installer sur la console Windows ou installer une console type Linux (genre babun).

27 décembre 2016 à 23:30:07

merci a5er

mais comment l'installer? 

Apprendre pour être heureux!
13 février 2017 à 0:27:27

Bonjour à tous,

Voilà plusieurs jours que fais des recherches à propos du TP de la todolist partagée en temps réel que ne parviens pas à conclure. Je m'en remets à la bonne vieille coopération dans l'espoir que je vais finalement pouvoir passer à autre chose! :p

En gros, je suis capable de faire communiquer les clients entre eux par des socket.emit et des socket.broadcast.emit. Le problème est au niveau du serveur : je ne trouve pas comment sauvegarder un array (la todolist à jour) sur le serveur pour que les clients qui se connectent puissent venir la récupérer. J'ai essayé de sauvegarder la todolist dans un objet de socket.io que j'ai nommé socket.todolist, mais j'ai bien peur de me rendre compte que cet objet, bien qu'écrit sur le fichier du serveur, est relatif à chaque client, et donc, irrécupérable à moins d'une requête entre clients. C'est un peu embêtant, car au moment de la connexion d'un nouveau client, je ne peux tout de même pas lui faire demander au serveur d'aller chercher la todolist à jour chez tous les autres clients en même temps! C'est sans doute peu optimisé, voire catastrophique si par malheur, certains clients venaient à retourner des listes différentes... Non, il doit forcément avoir un moyen de sauvegarder une variable sur le serveur qui puisse être demandée par un nouveau client à sa connexion! Mais j'ignore comment.

Je suis persuadé que j'ai dû mal comprendre quelque chose pendant le tutoriel. Je me souviens de l'existence de cookie-session, mais je ne saurais pas comment faire communiquer socket.io avec la session (avec les "req" et tout), et c'est encore en supposant que la solution se trouve vraiment là!

Une âme charitable pourrait-elle ajouter la pierre qu'il manque à mon édifice? Je me sens un brin perdu après toutes mes recherches.

16 février 2017 à 17:49:29

Pourquoi ne pas utiliser une variable globale ?

19 février 2017 à 22:46:20

La solution était donc aussi simple!?! O.O

Si je résume, donc, l'utilité de créer une variable socket.nom_de_la_variable côté serveur, est de gérer du côté serveur des informations propres à un seul client, mais cela n'empêche en rien de faire usage de variable globales qui pourront être partagées à quiconque en fait la requête au serveur?

Quelle révélation! La solution était donc sous mon nez!

2 mars 2017 à 11:43:20

Bonjour à tous, 

Je développe un Bot pour Discord avec node.js et j'essaie de vérifié si je peux me connecter à un site web, en faite c'est pour moi vérifié si mon Application est bien active sur mon serveur via un autre ordinateur. J'ai fait des recherches mais je ne trouve pas, je voudrais faire ceci un peu près : 

		var monserv = "https://monserveur.com/botdiscord";
		if (monserv === (connection possible){
			console.log('ton serveur fonctionne')
		}else {
			console.log('erreur, ton serveur est down')
		}
Mais je ne trouve pas ce que je dois mettre dans le if :/
Si quelqu'un peut m'aider :) 
Cordialement


23 mars 2017 à 17:32:13

Bonjour , je suis un débutant , mais ce sujet m'intéresse énormément mais quand je marque node -v dans le terminal il me répond ceci : > node -v

ReferenceError: node is not defined

    at repl:1:1

    at sigintHandlersWrap (vm.js:22:35)

    at sigintHandlersWrap (vm.js:73:12)

    at ContextifyScript.Script.runInThisContext (vm.js:21:12)

    at REPLServer.defaultEval (repl.js:340:29)

    at bound (domain.js:280:14)

    at REPLServer.runBound [as eval] (domain.js:293:12)

    at REPLServer.<anonymous> (repl.js:538:10)

    at emitOne (events.js:101:20)

    at REPLServer.emit (events.js:188:7)


Donc je suis bloqué des la 1er étape , pourrais je avoir de l'aide merci d'avance .
5 juin 2017 à 20:03:47

@Mateo21

Bonsoir,

J'ai acheté votre livre à la F..C intitulé "Des applications ultra-rapides avec Node.js" et je me permets de vous adresser une remarque.

A la page 60 "Les bases d'EJS", vous mentionez ceci : "Nous pouvons maintenant déléguer la gestion de la vue (du HTML) à notre moteur de template.  Plus besoin d'écrire du milieu du code JavaScript comme un cochon !

A la page 72, dans la correction de la "Todo List", nous constatons l'inverse, c'est-à-dire de l'écriture de code JavaScript dans votre template HTML

A la page 73, vous dites ceci : "Du côté template, qu'est ce qu'il y a de particulier? Pas grand chose, si ce n'est que je parcours la to do list avec un forEach...

Je voulais savoir si tout ceci n'était pas contradictoire

20 juillet 2017 à 15:56:26

Bonjour,

Je ne sais pas trop si quelqu'un a déjà relevé ce point (je n'ai pas encore parcouru les 8 pages du forum...) mais voici mon problème :

Dans le cours, il est dit :

Node.js est bas niveau.

Est-ce que le créateur du cours peut m'expliquer ce qu'il veut dire par là, car pour moi, un langage bas niveau est dépendant de la partie matérielle (on ne code pas de la même manière selon le type de processeur, par exemple).

Merci d'avance pour la réponse ;)

9 octobre 2017 à 13:42:11

Bonjour, 

J'ai un soucis pour lancer le serveur

var http = require('http');

var server = http.createServer(function (req, res) {
    res.writeHead(200);
    res.end('Salut tout le monde !');
});
server.listen(8080);

le test pour voir si node.js a bien été installé marche bien mais maintenant j'ai une erreur qui s'affiche : 

$ node server.js
module.js:473
      throw err;
      ^

Error: Cannot find module 'D:\javascript_code\nodejs\server.js'
    at Function.Module._resolveFilename (module.js:527:15)
    at Function.Module._load (module.js:453:25)
    at Function.Module.runMain (module.js:665:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:607:3

Je suis sous Windows 10 dernière version, j'ai déjà tenté de désinstaller et de réinstaller Node.js. Je ne sais pas d'où viens le problème. Des idées ?

10 octobre 2017 à 9:00:46

@neok

neok a écrit:

Bonjour, 

J'ai un soucis pour lancer le serveur

var http = require('http');

var server = http.createServer(function (req, res) {
    res.writeHead(200);
    res.end('Salut tout le monde !');
});
server.listen(8080);

le test pour voir si node.js a bien été installé marche bien mais maintenant j'ai une erreur qui s'affiche : 

$ node server.js
module.js:473
      throw err;
      ^

Error: Cannot find module 'D:\javascript_code\nodejs\server.js'
    at Function.Module._resolveFilename (module.js:527:15)
    at Function.Module._load (module.js:453:25)
    at Function.Module.runMain (module.js:665:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:607:3

Je suis sous Windows 10 dernière version, j'ai déjà tenté de désinstaller et de réinstaller Node.js. Je ne sais pas d'où viens le problème. Des idées ?

Bonjour.

Bon ton code fonctionne bien; le probleme c'est que ton fichier ne s'appel pas server.js , verifie le nom de ton fichier, si tu l'as appeleé app.js alors il faut utiliser ce nom au lieu de server.js , ou bien t'es pas positionné dans le bon dossier où se trouve ton fichier server.js , donc verifie juste le nom de ton fichier et son emplacement 

10 octobre 2017 à 15:40:16

Merci de m'avoir répondu marwein. En fait j'ai réussi à trouver mon problème. Le message d'erreur ne veux rien dire et pourtant mon port 8080 était apparemment déjà utilisé. Alors je recommande à tout ceux qui ont un problème étrange dans le style du mien de changer le port en 3000. C'est bizarre mais c'est comme ça.
20 décembre 2017 à 0:34:39

Bonjoir,

ça commence à faire un moment que je bloque sur un problème sur l'exercice de la todolist en temps réel : tout fonctionne bien au niveau du projet, je pourrai le rendre tel quel mais j'ai appliqué quelques modifs au niveau du style et comme on est des gens civilisés ici, je veux éviter de coder comme un porc mon CSS dans une balise style de mon template.

Le soucis est que je prends une 404 lorsque j'essaie de faire un appel à mon fichier CSS. Voilà les données que j'ai à vous fournir :

  • structure :
  • serveur:
var http = require('http');
var express = require('express');
var path = require('path');

var app = express();

var server = http.createServer(app);

var todolist = [];

// Indique que le dossier /public contient des fichiers statiques
app.use(express.static(__dirname + '/public'))

/* On affiche la todolist et le formulaire */
.get('/', function(req, res) { 
    res.render('todo.ejs', {todolist: todolist});
})

/* On redirige vers la todolist si la page demandée n'est pas trouvée */
.use(function(req, res, next){
    res.redirect('/');
});

// GESTION DES ECHANGES PAR SOCKET
var io = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
    socket.emit('changement_liste', todolist);

    socket.on('changement_liste', function(liste_client) {
        todolist = liste_client;

        socket.broadcast.emit('changement_liste', todolist);
    });
});

server.listen(80);
  • template :
<!DOCTYPE html>
<html>
    <head>
        <title>Ma todolist</title>
        <!-- <style>
            body {
                font-family: sans-serif;
            }

            li {
                padding: 5px;
                margin: 5px;
                display: inline-block;
                border-radius: 25px;
                border: 1px solid lightblue;
                background-color: aliceblue;
            }

            a {
                display: inline-block;
                width: 15px;
                height: 20px;
                padding: 5px;
                margin-right: 5px;
                text-decoration: none;
                color: red;
                background-color: beige;
                border: 1px solid orange;
                border-radius: 100%;
            }

            a:hover{
                background-color: orange;
                color: white;
            }
        </style> -->
        <link href="/css/style.css" rel="stylesheet" type="text/css"/>

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    </head>

    <body>
        <h1>Ma todo-list</h1>

        <ul id="liste">
        </ul>

        <p>
            <form method="get" action="/" id="formulaire">
                <label for="newtodo">Que dois-je faire ?</label>
                <input type="text" name="newtodo" id="newtodo" autofocus />
                <input type="submit"/>
            </form>
        </p>
        
		<script src="/socket.io/socket.io.js"></script>
        <script>
            // connection serveur
            var socket = io.connect('http://localhost:80');

            // Instanciation des variables
            var listeDOM = $('#liste');
            var input = $('#newtodo');
            var liste_locale = [];
            
            // Listener formulaire
            $('#formulaire').submit(function() {
                var nouvel_item = input.val();
                input.val('');

                liste_locale.push(nouvel_item);

                socket.emit('changement_liste', liste_locale);

                update_DOM();

                // Blocage de la fonction de submit du formulaire
                return false;
            });

            // Fonction de mise à jour du DOM
            function update_DOM(){
                // Mise à jour du DOM
                listeDOM.empty();

                $.each(liste_locale, function(index, valeur) {
                    // Création d'un nouvel élément pour chaque item de la liste
                    var item = '<li><a onclick="supprimer(' + index + ');">✘</a>' + valeur + '</li>';
                    
                    // Ajout dans le DOM
                    listeDOM.append(item);
                });
            };

            // Fonction de suppression d'un élément
            function supprimer(index){
                liste_locale.splice(index, 1);

                socket.emit('changement_liste', liste_locale);

                update_DOM();
            }


            socket.on('changement_liste', function (liste_serveur){
                liste_locale = liste_serveur;

                update_DOM();
            });

        </script>
    </body>
</html>

J'ai recherché pas mal comment charger des fichiers statiques via express (d'où la première ligne d'utilisation de "app") mais les solutions que j'ai trouvées ne fonctionnent pas pour moi.

Merci d'avance pour ceux qui passeront du temps sur mon problème.

Autre question : je regardais le chapitre sur l'optimisation d'applications et je me demandais si Node gère bien la communication entre différentes instances?

En d'autres termes si on pouvait lancer 10~15 instances d'un chat par exemple, permettant aux utilisateurs de communiquer entre eux sans distinction de l'instance sur laquelle ils se trouvent. Et question subsidiaire, si il est possible de connaitre l'instance sur laquelle on se connecte lors des tests?

-
Edité par Nalsi 20 décembre 2017 à 11:06:44

Développeur web back-end
20 décembre 2017 à 15:50:18

Bonjour à tous,

Il y a un point que je ne comprends pas dans la correction du TP "Super Chat" : dans le script app.js à la ligne 12, la fonction de callback prend comme second paramètre la variable pseudo

io.sockets.on('connection', function (socket, pseudo) {
 [...]
});

Comment le pseudo est-il passé à cette fonction ?

D'avance merci !

21 décembre 2017 à 17:04:05

Le pseudo est undefined avant qu'une connexion se fasse, c'est lors du premier échange client-serveur que la variable est instanciée, il me semble.
Développeur web back-end
31 décembre 2017 à 17:30:02

Petit up sur le sujet de l'intégration de fichier statiques (rapport à mon message du 20 décembre), quelqu'un aurait une idée? Parce que la techno m'intéresse vraiment pour un projet perso mais si je dois faire le style dans le HTML c'est mort.
Développeur web back-end
31 décembre 2017 à 23:57:26

Nalsi a écrit:

Petit up sur le sujet de l'intégration de fichier statiques (rapport à mon message du 20 décembre), quelqu'un aurait une idée? Parce que la techno m'intéresse vraiment pour un projet perso mais si je dois faire le style dans le HTML c'est mort.


T'as tt ce qu'il faut par ici : 

http://expressjs.com/fr/starter/static-files.html

Tu te doute bien qu'il y a tjr des sloutions 

2 janvier 2018 à 22:01:06

En fait c'était un problème de cache navigateur, après avoir relancé le programme sans bouger une ligne, ça fonctionnait.

marwein a écrit:

T'as tout ce qu'il faut par ici : 

http://expressjs.com/fr/starter/static-files.html

Tu te doutes bien qu'il y a toujours des solutions 

Nalsi a écrit:

J'ai recherché pas mal comment charger des fichiers statiques via express (d'où la première ligne d'utilisation de "app") mais les solutions que j'ai trouvées ne fonctionnent pas pour moi.

... oui ... je me doute ... c'est pour ça que je cherche, sur google et compagnie mais ne trouvant rien je demande ici ... J'ai du mal à trouver une réponse appropriée à ta dernière phrase, je dois dire. o_O

Développeur web back-end
3 janvier 2018 à 18:38:08

Je vois que t'es assez fort en ortho ... Graphe pour finir mes mots c'est parfait , t'as réussi à résoudre ton problème. Evites les commentaires sur la grammaire orthographe etc, si tu veux des réponses bien écrites alors il faudra poser ta question sur le monde ou Larousse .il n y a pas que des français dans ce forum ;)

Cours Node.js : c'est parti !

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown