2017-08-10 1 views
0

J'ai deux modèles: User, associé par une référence un-à-plusieurs avec Member.Voiles/ligne de flottaison: obtenir des valeurs de promesses dans le modèle

Je veux récupérer le prenom & lastName de User du modèle Member, de sorte que j'ai ajouté une fonction getName à Member, qui d'abord remplir le champ « utilisateur », puis retourne une valeur lorsqu'elle est appelée à partir d'un modèle comme ceci:

<p><%= data.members[i].getName() %></p> 

Mais je ne reçois que « non défini » dans le modèle (alors que je peux imprimer les bonnes valeurs dans la console à l'intérieur de la fonction getName). Je suppose que cela est dû au fait que puisque je dois interroger la base, getName va async et renvoie une promesse.

Voici mes modèles:

/** 
* User.js 
*/ 
module.exports = { 
    attributes : { 
    firstName : 'string', 
    lastName : 'string', 
    } 
} 

/** 
* Member.js 
*/ 
module.exports = { 
    attributes : { 
    user : { 
     model : 'User' 
    }, 
    getName: function() { 
     return Member 
     .findOne({ id : this.id }) 
     .populate('user') 
     .exec(function(err, member) { 
      if(err) return err; 
      return member.user.firstName +' '+ member.user.lastName; 
     }); 
    } 
    } 
} 

quelqu'un peut me aider en me disant ce qui ne va pas avec mon code?

P.S. : Cela peut être résolu en remplissant le champ 'user' du contrôleur au lieu du modèle, mais j'ai un autre problème comme celui-ci qui suivrait les mêmes principes.

+0

Il ressemble à ce numéro: https://stackoverflow.com/questions/22823796/sails-js-get-async-data-from-an-ejs-file?rq=1 Pas très prometteur dans mon cas .. . – Paul

Répondre

0

Votre soupçon est correct - vous ne pouvez pas appeler des fonctions asynchrones dans un modèle de vue, car ces modèles sont rendus de manière synchrone. Comme vous l'avez indiqué dans vos "p.s.", la bonne réponse consiste à rassembler toutes les données de votre modèle dans le contrôleur, puis à les envoyer à la vue dans un seul objet.