Ecco un esempio di un servizio Web API REST che carica dinamicamente il file del gestore js in base alla URL inviato al server :
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);
gestori nel mio caso sono in una sottocartella/TrainerCentral, quindi la mappatura funziona così:
localhost: 8080/TrainerCentral/Ricetta verrà convertito il file js/TrainerCentral /Recipe.js localhost: 8080/TrainerCentral/Workout verrà convertito /TrainerCentral/Workout.js di file js
ecco un gestore esempio in grado di gestire ciascuna delle azioni HTTP principali 4 per il recupero, l'inserimento, l'aggiornamento, e cancellazione dei dati.
/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");
}
};
avviare il server dalla riga di comando con "index.js nodo"
Buon divertimento!
Non sono sicuro di aver capito. Devi semplicemente 'var m = require ('./ lib/api/user_getDetails.js')' e usa quel modulo nella tua risposta. Mi sto perdendo qualcosa? – freakish
Lo voglio caricare dinamicamente. Cioè, se aggiungo una nuova funzione API, non devo richiederlo manualmente. Ma non sono sicuro di come farlo. –
Quindi, vuoi un autoloader? –