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 :
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
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); } }); }
Et voici ce que je récupère :
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}
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...Envoyé par node.js
Merci d'avance pour vos idées.
Partager