AiNoTame

Dio è nella pioggia.
posts - 17, comments - 79, trackbacks - 0

Webapi-like controllers in NodeJS+ExpressJS

Lavorando su un progetto ~MEAN (MongoDB + ExpressJS + AngularJS + nodeJS) mi sono chiesto: “perchè non creare un modulo di registrazione custom dei controller simile a quella delle webapi di asp.net”? da qui è nato il seguente modulo:

 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
var path = require('path');
var fs = require('fs');
var config = require('./config');
var _ = require('lodash');

var getControllersInServerFolder = function (serverFolder) {
    if (_.isEmpty(serverFolder)) {
        serverFolder = config.settings.controllersFolder;
    }

    var controllers = [];

    var fileSystemObjects = fs.readdirSync(serverFolder); //read folder content
    if (_.isArray(fileSystemObjects)) {
        _.forEach(fileSystemObjects, function (fso) {
            var fsoFullPath = path.join(serverFolder, fso);
            var fsoStat = fs.statSync(fsoFullPath);
            if (fsoStat.isFile() && fso.endsWith('controller.js')) {
                controllers.push(require(path.relative(__dirname, fsoFullPath)));
            } else if (fsoStat.isDirectory()) {
                _.union(controllers, getControllersInServerFolder(fsoFullPath));
            }
        });
    }

    return controllers;
};

exports.getControllers = getControllersInServerFolder;

Quindi nello startup del server nodejs:

1
2
3
_.forEach(require('controllers-manager')..getControllers(), function(controller) {
	server.use(controller.path, controller.router); // register route into expressjs
});

Ora i controller sono tutti quei files definiti nella cartella config.settings.controllersFolder (o sottocartelle) che terminano con ‘controller.js’ e hanno tutti la seguente struttura:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
var express = require('express');
var router = express.Router();

//apply before any actions (check authorizations...)
router.use(function(req, res, next) {
	next(); //go to next 
});

router.get('/message', function(req, res, next) {
	res.send({'Hello world'});
});

exports.path = '/api/sample';
exports.router = router;

Facile, semplice e veloce.

Print | posted on domenica 12 ottobre 2014 18:49 | Filed Under [ Javascript Nodejs ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET