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 :

Traitement sur stream


Sujet :

NodeJS

  1. #1
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut Traitement sur stream
    Bonjour,

    Tout d'abord excusez-moi si ce n'est pas la bonne section, je n'en ai pas trouvé pour Node.js.

    Je développe un site web avec node et connect de sencha, et je voudrais mettre en place une internationalisation. Je voudrais donc que les pages HTML que je délivre actuellement via connect.static passent par une étape de compilation qui remplace des labels {lang.MAPROPRIETE} par le texte de la langue de mon choix.

    J'ai réussi à récupérer le header http Accept-Language, et je voudrais maintenant coder un wrapper autour de connect.static pour remplacer les labels contenus dans la réponse avant envoi. Là où je bloque, c'est comment appliquer ma fonction de traduction en l'intercalant entre le stream de lecture et le stream d'écriture response. Je ne suis pas sûr de comprendre complètement le fonctionnement des Stream dans Node et de la fonction pipe.

    Voilà où j'en suis en code :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    var send = require('send');
    var stream = require('stream');
    var utils = require('connect').utils;
    var parse = utils.parseUrl;
    var url = require('url');
     
    // Connect.static with lang detection and translation
    module.exports = function (root, options) {
     
        if (!root) throw new Error('static() root path required');
     
        options = options || {};
        if (!options.default_locale) {
            options.default_locale = 'en';
        }
     
        return function staticlang(req, res, next) {
            var accept_language = req.headers['accept-language'];
            var locales = [];
     
            if (accept_language) {
                accept_language.split(',').forEach(function (lang) {
                    locales.push(lang.split(';', 1)[0].toLowerCase());
                });
                req.locales = locales;
            } else {
                req.locales = [options.default_locale];
            }
     
            if ('GET' != req.method && 'HEAD' != req.method){ next(); }
            else {
                var path = parse(req).pathname;
                var pause = utils.pause(req);
                console.log("Connect lang ",req.locales, path);
     
                send(req, path)
                    .maxage(options.maxAge || 0)
                    .root(root)
                    .hidden(options.hidden)
                    .on('error', function error(err) {
                        if (404 == err.status) {  next(); pause.resume(); }
                        else { next(err); }
                    })
                    .on('directory', function directory() {
                        if (options.redirect === false) { next(); pause.resume(); }
                        else {
                            var pathname = url.parse(req.originalUrl).pathname;
                            res.statusCode = 301;
                            res.setHeader('Location', pathname + '/');
                            res.end('Redirecting to ' + utils.escape(pathname) + '/');
                        }
                    })
                    .on('data', function(data){
                        console.log("Data: ",data); //<- je ne reçois rien ici
                    })
                    .pipe(res);
            }
     
        };
    };
    Je ne souhaite pas utiliser un langage de templating côté serveur car j'utilise déjà handlebars côté client.
    Merci d'avance pour votre aide.
    One Web to rule them all

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    pour l'internationalisation je travaille avec des fichier locale

    par exemple pour un panel client comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
      title: 'Client Panel',
      items [
    ....
    je défini un fichier de localisation qui est un simple json que je charge en fonction de la langue demandé (par form ou par httpaccept)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    panelClient: {
      title: 'Informations Client',
    ....
    mon fichier de langue contient toutes les chaines localisé de mon IHM. du coup pour définir mon panel je n'ai pas besoin de chaines
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
      title: locale.panelClient.title,
      items [
    ....
    mon code est donc indépendant de la langue et je n'ai rien de complexe à faire pour l’internationaliser si ce n'est que de fournir un fichier de Strings par langues.

    cette méthode fonctionne avec toutes les lib et tout développement js

    A+JYT

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Citation Envoyé par SylvainPV Voir le message
    c'est comment appliquer ma fonction de traduction en l'intercalant entre le stream de lecture et le stream d'écriture response. Je ne suis pas sûr de comprendre complètement le fonctionnement des Stream dans Node et de la fonction pipe.
    La fonction pipe connecte un flux d’entrée a un flux de sortie sans altérer celui-ci, sauf peut-être l’encodage d’un flux textuel, l’objet options que l’on peut passer en paramètres de cet fonction est mal documenté

    Pour intercaler des données lors de l’écriture d’un flux dans un autre, rien de plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var fs = require('fs');
    var input = fs.createReadStream("input.txt");
    var output = fs.createWriteStream("output.txt");
    var i=1;
    input.on('data',function(chunk)
    {
    	output.write("chunk "+ (i++) + " : ");
    	output.write(chunk);
    });
    Bon c’est sûr que cela ne va pas t’aider résoudre ton problème initial. C’est juste que je trouve le system stream sous Node simple
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    @sekaijin: merci, j'ai pensé à le faire côté client mais je ne suis pas sûr que ça couvre tous mes besoins, notamment peut-être des bouts de scripts qui vont changer d'un pays à l'autre (traitement des dates etc...) ; de plus ta solution oblige à générer tout le contenu textuel des pages en Javascript, impossible d'envoyer du texte directement inséré dans du HTML.

    @p3g45e: d'accord, j'ai voulu faire quelque-chose de similaire mais il me semble que la fonction pipe gère d'autres choses que je ne gère pas en m'intercalant simplement sur l'évènement data (pause d'écritures ?) :

    ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .on('data', function(data){
          res.write("Data: ",data);
    });
    Aurais-tu un exemple de code s'appliquant au flux d'une requête-réponse HTTP ?
    One Web to rule them all

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Es-tu sur que la référence sur laquelle tu te branche a l’évènement 'data' est bien une Readable Stream ?

    N’hésite pas à utiliser le debugger pour savoir ce que fait une fonction, un simple F11 sur le pipe serait très instructif.
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  6. #6
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Effectivement je crois que le problème vient de là, mon objet n'est pas un Stream classique mais un SendStream défini par cette librairie : https://github.com/visionmedia/send/...er/lib/send.js

    Le prototype est le même : SendStream.prototype.__proto__ = Stream.prototype; mais les méthodes sont presque toutes overridées. Je crois que je vais avoir du mal à bricoler là dedans

    Tant pis, je vais passer par du templating serveur alors. Si vous connaissez une solution simple et facilement intégrable avec connect, je suis preneur.
    One Web to rule them all

Discussions similaires

  1. Traitement sur un selectedIndex inexistant ?
    Par 10-nice dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/08/2005, 10h33
  2. [C#] [.NET 1.1] [VSTUDIO 2003] Traitement sur les fontes
    Par stailer dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/08/2005, 19h53
  3. [VB.NET] Traitement sur chaine (simple)
    Par Tempotpo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 13h20
  4. [Multimédia] Explication sur stream audio
    Par champion dans le forum Développement
    Réponses: 1
    Dernier message: 20/01/2005, 12h14
  5. [FLASH MX 2004] Traitements sur le resultat d'un AS.
    Par Med_Prog dans le forum Flash
    Réponses: 8
    Dernier message: 21/11/2004, 13h59

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