web-dev-qa-db-fra.com

Chargement dynamique des modules Node.js en fonction de l'itinéraire

Je fais un projet dans Node.js en utilisant express. Voici ma structure de répertoire:

root
|-start.js
|-server.js
|-lib/
|    api/
|        user_getDetails.js
|        user_register.js

Le lib/api/ Le répertoire contient un certain nombre de fichiers JS relatifs à l'API. Ce que je dois faire, c'est créer une sorte de système d'accrochage, que chaque fois qu'une des fonctions de l'API est demandée au serveur HTTP express, il fait toute action spécifiée dans le gestionnaire d'API correspondant. C'est probablement déroutant, mais j'espère que vous avez l'idée.

  1. Larry envoie une demande via POST pour obtenir les détails de l'utilisateur.
  2. Le serveur regarde dans lib/api pour trouver la fonction associée à cette requête.
  3. Le serveur effectue une action et renvoie des données à Larry.

J'espère que vous pourrez m'aider. Je pensais que cela pourrait être fait à l'aide de prototypes, mais je n'en suis pas sûr.

Merci!

22
user775171

app.js

var c_file = 'html.js';

var controller = require(c_file);
var method = 'index';

if(typeof(controller[method])==='function')
    controller[method]();

html.js

module.exports =
{
    index: function()
    {
        console.log('index method');
    },
    close: function()
    {
        console.log('close method');    
    }
};

dynamiser un peu ce code, vous pouvez faire des choses magiques: D

4
ZiTAL

Voici un exemple de service Web API REST qui charge dynamiquement le fichier js du gestionnaire en fonction de l'URL envoyée au serveur:

server.js

var http = require("http");
var url = require("url");

function start(port, route) {
   function onRequest(request, response) {
       var pathname = url.parse(request.url).pathname;
       console.log("Server:OnRequest() Request for " + pathname + " received.");
       route(pathname, request, response);
   }

   http.createServer(onRequest).listen(port);
   console.log("Server:Start() Server has started.");
}

exports.start = start;

router.js

function route(pathname, req, res) {
    console.log("router:route() About to route a request for " + pathname);

    try {
        //dynamically load the js file base on the url path
        var handler = require("." + pathname);

        console.log("router:route() selected handler: " + handler);

        //make sure we got a correct instantiation of the module
        if (typeof handler["post"] === 'function') {
            //route to the right method in the module based on the HTTP action
            if(req.method.toLowerCase() == 'get') {
                handler["get"](req, res);
            } else if (req.method.toLowerCase() == 'post') {
                handler["post"](req, res);
            } else if (req.method.toLowerCase() == 'put') {
                handler["put"](req, res);
            } else if (req.method.toLowerCase() == 'delete') {
                handler["delete"](req, res);
            }

            console.log("router:route() routed successfully");
            return;
        } 
    } catch(err) {
        console.log("router:route() exception instantiating handler: " + err);
    }

    console.log("router:route() No request handler found for " + pathname);
    res.writeHead(404, {"Content-Type": "text/plain"});
    res.write("404 Not found");
    res.end();

}

exports.route = route;

index.js

var server = require("./server");
var router = require("./router");

server.start(8080, router.route);

les gestionnaires de mon cas se trouvent dans un sous-dossier/TrainerCentral, donc le mappage fonctionne comme ceci:

localhost: 8080/TrainerCentral/La recette sera mappée au fichier js /TrainerCentral/Recipe.js localhost: 8080/TrainerCentral/Workout sera mappée au fichier js /TrainerCentral/Workout.js

voici un exemple de gestionnaire qui peut gérer chacune des 4 principales actions HTTP pour récupérer, insérer, mettre à jour et supprimer des données.

/TrainerCentral/Workout.js

function respond(res, code, text) {
    res.writeHead(code, { "Content-Type": "text/plain" });
    res.write(text);
    res.end();
}

module.exports = {
   get: function(req, res) {
       console.log("Workout:get() starting");

       respond(res, 200, "{ 'id': '123945', 'name': 'Upright Rows', 'weight':'125lbs' }");
   },
   post: function(request, res) {
       console.log("Workout:post() starting");

       respond(res, 200, "inserted ok");
   },
   put: function(request, res) {
       console.log("Workout:put() starting");

       respond(res, 200, "updated ok");
   },
   delete: function(request, res) {
       console.log("Workout:delete() starting");

       respond(res, 200, "deleted ok");
   }
};

démarrez le serveur à partir de la ligne de commande avec "node index.js"

S'amuser!

2
JJ_Coder4Hire