Générez vos fils RSS et Atom en Node.js

Le fil de syndication est un incontournable pour tout site souhaitant partager des articles facilement avec d'autres systèmes. Mieux connu par le nom des différents standards (tels que RSS ou Atom), les fils peuvent être relativement lourds à générer sans l'utilisation d'un module prennant en charge le formattage. Si vous effectuez des applications en Node.js, voici un module qui va vous simplifier la vie!

Avant de commencer, je souhaite préciser que feed est le premier module Node.js que j'ai conçu disponible via le gestionnaire de paquets npm. Également, vous pouvez obtenir le code source sur le répertoire Github de feed.

Installation du module

Rendez-vous dans le répertoire de votre projet à partir de la ligne de commande pour installer le module feed. Exécutez la commande suivante (qui vous est probablement déjà familière ;D):

$ npm install feed

Construction d'un flux de syndication

En premier, il est nécessaire d'initialiser un nouvel objet Feed. Lors de la création de l'objet, vous devez également envoyé en paramètre un objet contenant les informations de base de votre fil. Voici un exemple ci-bas:

// Inclusion du module
var Feed = require('feed');

// Initialisation du module
var feed = new Feed({  
    title:          'Titre de mon fil de syndication',
    description:    'Description de mon fil!',
    link:           'http://example.com/',
    image:          'http://example.com/logo.png',
    copyright:      'X11 License',

    author: {
        name:       'Monsieur X',
        email:      'monsieur.x@example.com',
        link:       'https://example.com/monsieur-x'
    }
});

En second temps, vous avez la possibilité de définir la thématique de votre fil. Les standards RSS et Atom offrent la possibilité d'identifier chaque fil par une ou plusieurs catégories. Ces paramètres sont facultatifs, mais toujours utiles pour accentuer la qualité de votre fil.

feed.category('Node.js');  
feed.category('JavaScript');  

Troisièmement, l'incontournable, la balise item ou entry! Ces deux balises permettent de définir un article à l'intérieur de votre fil de syndication. Si vous avez un blogue, il y a de très bonnes chances que vous ayez plusieurs billets à intégrer dans votre fil. Pour ajouter des articles, la meilleure façon est d'utiliser un tableau préalablement rempli avec vos articles et de le lire avec une boucle for:

for(var key in articles) {  
    feed.item({
        title:          articles[key].title,
        link:           articles[key].url,
        description:    articles[key].description,
        date:           articles[key].date
    });
}

À partir de maintenant, vous êtes prêt à générer votre flux! Pour ce faire, vous n'avez qu'à utiliser la fonction render() de cette façon:

var output = feed.render();  

La variable output contient maintenant l'ensemble de la structure XML de votre fil en format RSS 2.0. Vous vous demandez peut-être comment obtenir le fil en format Atom 1.0? En faites, feed.render() est la façon implicite d'appeller la fonction render(). Si vous voulez préciser le standard, il est possible de passer le nom du standard en paramètre, comme il est indiqué dans l'exemple suivant.

// Génération d'un fil RSS 2.0 valide
output = feed.render('rss-2.0');

// Génération d'un fil Atom 1.0 valide
output = feed.render('atom-1.0');  

Et oui, c'est aussi simple que ça :)! Il ne vous reste plus qu'à envoyer le contenu de la variable output au client.

Utilisation avec Express.js

Utiliser le module feed avec le module d'applications Web Express.js simple comme bonjour! Considérons que vous utilisez la fonction app.get() pour router une requête HTTP de type GET à l'URI /rss (par exemple, http://blogue.jpmonette.net/rss). Tout d'abord, générez le fil comme nous avons pu le faire précédemment à l'intérieur de la fonction de rappel (mieux connu sous le doux nom anglophone de callback). Par la suite, retournez le résultat généré, en prennant soin de bien spécifier le Content-Type à text/xml, pour que le navigateur (ou tout autre lecteur de fils) traite la requête de façon adéquate.

app.get('/rss', function(req, res) {

    // Initialisation de l'objet
    var feed = new Feed({
        title:          'My Feed Title',
        description:    'This is my personnal feed!',
        link:           'http://example.com/',
        image:          'http://example.com/logo.png',
        copyright:      'Copyright © 2013 John Doe. All rights reserved',

        author: {
            name:       'John Doe',
            email:      'john.doe@example.com',
            link:       'https://example.com/john-doe'
        }
    });

    // Ceci est un exemple d'implémentation en utilisant
    // une fonction retournant les 5 derniers messages.
    // La fonction "findPosts()"" n'est pas affichée dans
    // cet exemple.
    Post.findPosts(function(posts, err) {
        if(err)
            res.send('404 Not found', 404);
        else {
            // Ajout des articles
            for(var key in posts) {
                feed.item({
                    title:          posts[key].title,
                    link:           posts[key].url,
                    description:    posts[key].description,
                    date:           posts[key].date
                });
            }
            // Paramétrage du Content-Type
            res.set('Content-Type', 'text/xml');

            // Retour du fil de type RSS 2.0 au client
            res.send(feed.render('rss-2.0'));
        }
    });
});

Maintenant, exécutez votre application avec node et dirigez vous à l'URL en question. Ça devrait faire le travail!

Conclusion

Et voilà, c'était aussi simple que cela :)! Maintenant, vos lecteurs peuvent enfin lire vos billets dans leurs lecteurs de fils, en utilisant votre fil généré dans votre application Node.js! Si vous avez des idées pour améliorer le module, je vous invite à me les faire parvenir sur Github.