Utiliser TypeScript au sein de Node.Js

09 octobre 2012

Dans un précédent article je vous ai présenté la dernière nouveauté de Microsoft, à savoir TypeScript . Pour résumer, TypeScript est un moyen de développer des programmes en JavaScript à l’aide d’un langage de plus haut niveau. On va voir dans cet article qu’il est aussi possible de l’utiliser avec la technologie Node.js, qui est du JavaScript côté serveur.

Dans un premier temps, il vous faut récupérer le fichier Node.js écrit en TypeScript qui permet d’exposer les modules du serveur. Vous le retrouverez soit sur le site TypeScriptLang.org , soit dans la solution que vous trouverez à la fin de cet article.

Dans un premier temps, nous allons créer un nouveau serveur Node.js, pour cela il vous faut déclarer les informations suivantes :

    ///
    import http = module("http")
    class HttpServer {
    NodePort: number;

    constructor (port: number) {
    this.NodePort = port;
    }

    onRequest(request: http.ServerRequest, response: http.ServerResponse) {
    response.end();
    }

    onStart() {
    var httpServer = http.createServer(this.onRequest);
    httpServer.listen(this.NodePort);
    }
    }

    var server = new HttpServer(42);
    server.onStart();

    console.log("HTTP server running at http://localhost:42/");
    

Nous avons donc ici importé le module Node.js via le chemin de référence que l’on peut voir en première ligne, puis nous avons importé le module http propre à Node.js afin de créer notre serveur. Nous voyons de plus que nous avons ici une classe qui gère la création du serveur, ainsi que la gestion des requêtes.

Afin de lancer votre serveur  à ce stade, il vous suffira dans une console Windows de taper la commande “node app.js” après avoir compilé votre fichier TypeScript. Bien entendu cela ne marchera que si vous avez un module Node.js installé sur votre machine.

Maintenant pour ceux qui ont déjà créé un serveur Node.js en JavaScript, vous aviez pour effectuer la même chose que ci-dessus un code similaire à celui-ci :

    var http = require("http")
    var HttpServer = (function () {
    function HttpServer(port) {
    this.NodePort = port;
    }
    HttpServer.prototype.onRequest = function (request, response) {
    response.end();
    };
    HttpServer.prototype.onStart = function () {
    var httpServer = http.createServer(this.onRequest);
    httpServer.listen(this.NodePort);
    };
    return HttpServer;
    })();
    var server = new HttpServer(42);
    server.onStart();
    console.log("HTTP server running at http://localhost:42/");
    

Ce qui est à mon sens beaucoup moins lisible pour la déclaration du serveur.

Maintenant me direz-vous à quoi cela sert-il d’avoir du JavaScript côté serveur ? Et bien c’est simple selon moi, JavaScript apporte une souplesse au niveau du code, et de l’interprétation des fichiers au niveau du serveur, typiquement sur Windows Azure, je trouve plus simple d’avoir une moulinette qui va chercher mon site dans un Blob Storage pour l’exécuter par la suite sur mon rôle. Cela me permet de modifier mes fichiers dans le Blob Storage, et ainsi les récupérer sur mon site sans avoir à redéployer.

Mais surtout, l’avantage avec Node.js, outre le fait qu’il soit cross-platform, c’est qu’il est possible d’accéder à des éléments typiquement serveur, tel qu’une base de données, une base documentaire comme MongoDB, et encore au système de fichier de Windows (ou Linux).

Par exemple, si je modifie mon code TypeScript afin d’obtenir ceci :

    ///

    import http = module("http")
    import url = module("url");
    import fs = module("fs");

    class HttpServer {
    NodePort: number;

    constructor (port: number) {
    this.NodePort = port;
    }

    onRequest(request: http.ServerRequest, response: http.ServerResponse) {
    var currentUrl = url.parse(request.url);

    console.log(currentUrl);
    if (currentUrl.pathname === "/") {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.write("<strong>Hello from Node.Js</strong>");
    } else if (currentUrl.pathname === "/GetFile") {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    var file = fs.readFileSync("app.ts");
    var content = file.toString("UTF-8", 0, file.length);
    response.write("<pre>" + content + "</pre>");
    } else {
    response.writeHead(500);
    response.write("Error");
    }

    response.end();
    }

    onStart() {
    var httpServer = http.createServer(this.onRequest);
    httpServer.listen(this.NodePort);
    }
    }

    var server = new HttpServer(42);
    server.onStart();

    console.log("HTTP server running at http://localhost:42/");
    

Lorsque j’irais sur l’url : http://localhost:42/GetFile il m’affichera le contenu de mon fichier app.ts dans ma page, comme on peut le voir ci-dessous :

Pour ceux qui connaissent Node.js, vous aurez néanmoins remarqué que je n’ai pas utilisé de Framework spécifique à Node.js tel qu’Express. Microsoft a actuellement migré ce dernier sur TypeScript, mais je souhaitais utiliser une approche plus simple pour cet article.

De plus, MongoDB a déjà lui aussi son fichier TypeScript, il peut donc être intéressant de migrer des applications existantes avec ce nouveau Framework.

Comme promis, je vous mets les sources de mon application de démonstration sur mon skydrive, n’hésitez pas à les télécharger.

Wilfried Woivré (16 Posts)

MVP Microsoft Azure – Soat Expert .Net / Azure

Animateur de la communauté Microsoft Azure France : https://facebook.com/groups/zecloud


Une réponse à Utiliser TypeScript au sein de Node.Js

  1. Ping : La communauté ZeCloud teste TypeScript sur Node.js - Windows Azure France - Site Home - MSDN Blogs

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>