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.