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 :

Asynchronisme : Service qui doit retourner une URL en synchrone


Sujet :

NodeJS

  1. #1
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut Asynchronisme : Service qui doit retourner une URL en synchrone
    Bonjour à tous,
    J'utilise donc le framework Sails avec Waterline comme ORM. J'ai écrit un petit service qui est censé me retourner les URLs des objets/actions du site. Actuellement, j'appelle ce service depuis les templates Jade.

    (Comme je suis seul à écrire ça, n'hésitez pas à me dire si le modèle de conception n'est pas bon, hein).

    La méthode pour récupérer des objets en base de donnée est asynchrone, bien entendu, et comme il est apparemment impossible de retourner des valeurs des callbacks des méthodes asynchrones, je suis un peu comme un canard devant un cure-dents.

    Voici le code de mon service geturl :
    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
    module.exports = {
        variete: function(id_objet) {
            var string = '/default_url';
            return onvariete(id_objet, function (err, url) {
              if (err) {
                  sails.log.error('Error : ', err);
              } else {
                  return url;
              }
            });
        }
    };
     
    function onvariete(id_objet, next) {
      var url = '/';
      return Variete.findOne({id:id_objet}).exec(function (err, v) {
        sails.log.info('URL Variety : '+ v.nom + ' / ' +id_objet + ' / ' + v.slug);
        if (err) {
          sails.log.error('Error : ' + v.nom + ' / ' + err);
          // Do nothing.
          return next(new Error('Variete error'), undefined);
        } else if (!v) {
          return next(new Error('Variete not found'), undefined);
        } else if (!v.slug) {
          // variete doesn't have a slug field
          // we redirect to /v/:id
          url += 'v/' + v.id;
          return next (null, url);
        } else {
          // Ok variete has got a slug field
          sails.log.info('GOT A SLUG! ' + v.slug);
          url += 'variete/' + v.slug;
          return next (null, url);
        }
      });
    }
    Dans le template Jade, j'ai embarqué ce service geturl dans un objet statique. Depuis le template Jade, je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(href="#{s.geturl.variete(ann.variete.id)}" title="#{ann.variete.name}") #{ann.variete.name}
    Et voici ce que je récupère :

    Citation Envoyé par node.js
    <a title="Tomate Coeur de Boeuf" href="undefined">Tomate Coeur de Boeuf</a>
    Voilà, je sens que mon approche n'est pas du tout la bonne, mais soit il faut que je trouve le bon modèle de conception en programmation fonctionnelle, soit il faut que je parvienne à insérer un effet de bord...

    Merci d'avance pour vos idées.
    Hayiiiiiiiiiiiiii !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Salut,

    pourrais-tu fournir le code de la fonction onvariete stp ?

  3. #3
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Il y est, normalement, mais il faut scroller dans la première fenêtre de code !
    Merci de ta réponse :-)
    Hayiiiiiiiiiiiiii !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Ah oui, autant pour moi ^^'.

    Alors AMHA, le problème ici est que tu dois attendre la réponse de la DB, pendant ce temps-là la valeur renvoyée par #find().exec() est undefined.

    Tu devrais plutôt définir ces url soit lorsque tu peuple ton objet ann.variete, auquel cas tu ajouterais un string ann.variete.url,
    soit dans le constructeur de cet objet, en attribuant .getUrl() comme une fonction qui renvoie l'url généré grâce à l'objet variete (accessible donc depuis this).

    Dans les deux cas tu n'as donc pas besoin de faire un appel à la base de donnée, ce qu'on cherche à éviter dans le cas présent, et ton template Jade sera donc de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(href="#{ann.variete.url}" title="#{ann.variete.name}") #{ann.variete.name}
    Si tu as besoin d'assistance pour les modifications que je t'ai proposées, pourrais-tu stp mettre la partie du code où tu peuple ann.variete stp ? ( ce coup-là je suis quasi-certain qu'il ne s'y trouve pas )

  5. #5
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Excellent !

    Effectivement, je pensais bien qu'il y avait un souci dans mon approche, mais je ne voyais pas où !

    En fait, je ne voulais pas stocker l'URL en base de donnée, parce que celle-ci-pourrait éventuellement évoluer, ou alors il pourrait y avoir plusieurs urls pour une instance. Si je me mets à le définir dans le MCD on n'en sort plus...

    Par contre, je stockais un champ "slug" qui contient une chaîne de caractères unique sans espaces et tout, et qui me permet de générer les URLs.

    J'ai donc ajouté une méthode d'instance à mes modèles, en faisant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        /*
         * Méthode d'instance
         */
        url: function(bool_url_courte) {
          if (!this.slug || !this.variete.slug || bool_url_courte){
            // L'annonce ou la variété n'ont pas de slug
            // On redirige alors vers /a/:id
            return '/a/' + this.id;
          } else {
            // L'annonce a ce qu'il faut
            return '/annonce/' + this.variete.slug + '/' + this.slug;
          }
        }
    Même principe pour Variété.

    Du coup, je peux accéder à l'url dans le template de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(href="#{ann.variete.url()}" title="#{ann.variete.name}") #{ann.variete.name}
    Je peux utiliser ann.url(true) si je souhaite avoir une url raccourcie.

    Merci bien, tu me sauves !
    Hayiiiiiiiiiiiiii !

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

Discussions similaires

  1. Bouton qui envoie vers une URL dans une fonction
    Par cecilouchou dans le forum Langage
    Réponses: 6
    Dernier message: 06/05/2013, 11h12
  2. [AC-2007] Condition WHERE en SQL qui me retourne une liste vide
    Par Rodrigue dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/11/2010, 15h28
  3. Service qui doit se contrôler lui-même
    Par gderenne dans le forum VB.NET
    Réponses: 5
    Dernier message: 29/01/2009, 16h56
  4. Process qui doit retourner une valeur
    Par Steff2 dans le forum Delphi
    Réponses: 5
    Dernier message: 06/09/2007, 03h57
  5. Réponses: 1
    Dernier message: 07/12/2006, 22h41

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