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 :

Afficher la météo avec node et openweathermap


Sujet :

NodeJS

Vue hybride

lostsoul Afficher la météo avec node... 02/04/2015, 17h20
xulien Bonjour lostsoul, ... 03/04/2015, 08h29
lostsoul Merci beaucoup pour ces... 03/04/2015, 09h04
xulien Attention, ne reprends pas... 03/04/2015, 09h26
lostsoul Vu l'autre msg. Moi, j'ai... 03/04/2015, 11h27
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut Afficher la météo avec node et openweathermap
    Bonjour,

    Je voudrais, avec node, afficher la météo sur une page ejs, depuis openweathermap. Dois-je utiliser un npm ou directement un code comme celui-ci :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    var querystring = require('querystring');
    var request     = require("request");
    var result = '';
    var text = '';
     
    var openWeatherMapQuery = querystring.stringify({
      q: "Bourges, France",
      lang: "fr",
      units: "metric"
    });
    var openWeatherMapURL = "http://api.openweathermap.org/data/2.5/weather?"+ openWeatherMapQuery;
     
    request({
      url: openWeatherMapURL,
      json: true // Nous recevrons un JSON
    }, function (error, response, resp) {
     
      if (!error && response.statusCode === 200) {
     
        var text = "Bulletin météo : "
        text += resp.weather[0].description
        text += ". Il fait actuellement "+ Math.round(resp.main.temp) +" degrés."
     
        var result = querystring.stringify({
          tl: "fr",
          q:  text,
          ie: "UTF-8"
        });
     
        console.log("Météo construite :");
        console.log(text);
        console.log(resp.main.temp);
     
      } else {
     
        console.log("Une erreur est survenue.");
      }
    })
     
    module.exports.result = result;
    module.exports.text = text;
    Je précise que je n'arrive pas à afficher le résultat dans ma page ejs. Est-ce qu'un npm serait mieux ? J'ai vu des examples avec le code directement dans la page web.

    Merci d'avance,
    Très cordialement,

    ANDRE Ani

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Par défaut
    Bonjour lostsoul,

    plusieurs problèmes dans ton scripts:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    module.exports.result = result;
    module.exports.text = text;
    module.exports ne peut être appeler qu'une seul fois, et ne sert pas à renvoyer un résultat de fonction, mais à exporter la fonction elle même pour que tu puisse l'appeler dans d'autres fichiers via un require.

    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
     
     
    // toto.js
    function toto (callback) {
       return callback(null, 'j\'ai une blague');
    }
     
    module.exports = toto;
     
    // tata.js
    var toto = require('./toto.js');
     
    toto(function(err, res) {
       if (err) throw err;
       console.log(res);
    });
    je t'invite d'ailleurs à chercher un peu sur la différence entre module.exports et exports.foo, sujet traité mille fois sur le net (et la flemme de tout réécrire )

    autre problème conceptuel, tu essaye de renvoyer le resultat d'un callback en dehors de celui ci. je pense à 'result' et 'text' dans request. Tes resultats, tu doit en faire quelque chose dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function (error, response, resp) { /* ici, car en dehors ils n'existent pas */ }
    soit simplement l'afficher dans la console comme tu le fais, soit renvoyer ces valeurs via un callback

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    function openWeatherMap (callback) {
      var querystring = require('querystring');
      var request     = require("request");
      var result = '';
      var text = '';
     
      var openWeatherMapQuery = querystring.stringify({
        q: "Bourges, France",
        lang: "fr",
        units: "metric"
      });
      var openWeatherMapURL = "http://api.openweathermap.org/data/2.5/weather?"+ openWeatherMapQuery;
     
      request({
        url: openWeatherMapURL,
        json: true // Nous recevrons un JSON
      }, function (error, response, resp) {
    
       if (error) return callback(err);
    
     
        if (!error && response.statusCode === 200) {
     
          var text = "Bulletin météo : "
          text += resp.weather[0].description
          text += ". Il fait actuellement "+ Math.round(resp.main.temp) +" degrés."
     
          var result = querystring.stringify({
           tl: "fr",
            q:  text,
            ie: "UTF-8"
          });
     
          console.log("Météo construite :");
          console.log(text);
          console.log(resp.main.temp);
          callback(null, text, resp.main.temp);
     
        } else {
     
          console.log("Une erreur est survenue.");
          callback(new Error("Une erreur est survenue."));
        }
      })
    });
     
    module.exports = openWeatherMap;
    voila en trés gros...

    Est-ce qu'un npm serait mieux ?
    lapin compris!

    Clairement, tu débute avec node.js, c'est pourquoi je t'invite à ne pas te décourager et à revoir la notion de callback et d'asynchronicité.

  3. #3
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Merci beaucoup pour ces explications. Je débute, et c'est un peu la galère j'avoue...
    Bon, j'ai compris pour module.exports et require, ça devrait aller mieux de ce côté là ;-)

    Par contre, ok, la fonction callback est une fonction passée en paramètre d'une autre, mais... Je suis un peu perdu pour comprendre comment récupérer mes variables depuis le callback pour les afficher...

    En plus, je ne suis pas sûr de la variable dont j'ai besoin pour afficher les infos météo, c'est result il me semble.

    /models/meteo.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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    function openWeatherMap (callback) {
     
    var querystring = require('querystring');
    var request     = require("request");
    var result = '';
    var text = '';
     
    var openWeatherMapQuery = querystring.stringify({
      q: "Bourges, France",
      lang: "fr",
      units: "metric"
    });
    var openWeatherMapURL = "http://api.openweathermap.org/data/2.5/weather?"+ openWeatherMapQuery;
     
    request({
      url: openWeatherMapURL,
      json: true
    }, function (error, response, resp) {
     
      if (!error && response.statusCode === 200) {
     
        var text = "Bulletin météo : "
        text += resp.weather[0].description
        text += ". Il fait actuellement "+ Math.round(resp.main.temp) +" degrés."
     
        var result = querystring.stringify({
          tl: "fr",
          q:  text,
          ie: "UTF-8"
        });
     
        console.log("Météo construite :");
        console.log(text);
        console.log(resp.main.temp);
        callback(null, text, resp.main.temp);
     
      } else {
     
        console.log("Une erreur est survenue.");
        callback(new Error("Une erreur est survenue."));
      }
    })
    };
     
    module.exports = openWeatherMap;
    /controllers/index.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
     
    var result = require('./../models/meteo.js');
    var text = require('./../models/meteo.js');
    var openWeatherMap = require('./../models/meteo.js');
     
    module.exports.index = function (req, res, next) {
      res.send('Hello World');
    };
     
    module.exports.test = function (req, res, next) {
        res.render('test.ejs', {title: 'Page de test'});
    };
     
    module.exports.essai = function (req, res, next) {
        res.render('essai.ejs', {
            title: 'c est un essai',
    	openWeatherMap: openWeatherMap,
    	text: text,
    	result: result
            }
        );
    };
    Enfin, merci encore, je vais continuer à patauger dans tout ça ;-)

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Par défaut
    Attention, ne reprends pas tel quel la fonction openWeatherMap, je devais déposer mon fils à l'école et j'ai répondu très vite, mais il ne faut pas la laisser en l'état.

    et dans ton index.js "module.exports.index = " c'est le mal!

    De plus je viens de voir ton autre fil concernant "Americano] Avoir des pages jade ou ejs", qui commence à tout mélanger, tu devrais en cloturer un des deux.

  5. #5
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Vu l'autre msg.
    Moi, j'ai testé en vitesse parce que j'avais du ménage à faire...

    Je peux supprimer l'autre fil, et on garde celui-la ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Par défaut
    va pour celui la!

    Je découvre, et, pour le moment, je voudrais arriver à faire une ptite appli single page
    la base de la base

    Site web ->
    La page est construite dynamiquement coté serveur, qui renvoi le résultat sous forme de HTML au navigateur pour chaque url et à chaque chargement de page.
    sans rechargement de page, le client n'est pas informé des modifications éventuelles sur le serveur.

    Appli web/Single page ->
    Au premier chargement, le navigateur récupère la page HTML principale statique (d'où le single page), et un ensemble de fichiers js qui se charge de construire dynamiquement le contenu coté client. Puis en cas de modification coté client, ce dernier peut interagir avec le serveur via de simple appel ajax.
    Pour gérer la partie client, c'est le boulot de framework tel que backbonejs, angularjs, emberjs, etc... l'api coté serveur est géré avec ce que tu veux: nodejs, php, java, ruby, est les (multiples) frameworks qui vont avec.

    Donc que veux tu faire, un site ou une appli?

    (...)assez simple (authentification locale, puis 2 / 3 trucs à afficher et ou / configurer, peut-être avec une BDD).
    Quand tu dis "assez simple", sache qu'il y a déjà pas mal de concept derrière l'authentification et la bdd

    Il faudrait déjà que tu me dise s'il s'agit juste d'un projet de "test" ou s'il y a une vrai finalité?

Discussions similaires

  1. Comment afficher deux images avec Node js ?
    Par keokaz dans le forum NodeJS
    Réponses: 5
    Dernier message: 03/10/2014, 06h11
  2. Ouvrir/afficher un fichier avec son logiciel par défaut
    Par Alain P. dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/06/2009, 18h47
  3. Comment afficher du texte avec swing ?
    Par meda dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/10/2004, 14h35
  4. Afficher une image avec swing
    Par arnonote dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 07/08/2004, 12h10
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 09h28

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