Rainbow
简体中文
A node Express router middleware for Ajax RESTful API base on certain folder path.
Rainbow mapping all HTTP request route to controllers folder each as path to file as URL.
Installation
$ npm install rainbow
Usage
In your express application main file app.js
:
var express = require('express');
var rainbow = require('rainbow');
var app = express();
rainbow.route(app);
app.listen(6060);
Controllers
All your controllers for catching HTTP request should be defined in each file in controllers/
folder (could be changed) as same path in URL.
This is the core design for Rainbow! And it makes routing much simpler only by files' paths!
Here writes a router something.js
in your controllers/
folder like this:
exports.get = function (req, res, next) {
res.send(200, 'Simple getting.');
};
If you need some filters, just add a filters
array property which contains your filters in filters/
folder to the handle function like this:
exports.get = function (req, res, next) {
res.send(200, 'Simple getting.');
};
exports.get.filters = ['authorization'];
Also you could define other HTTP methods handlers, but make sure in one file each URL! Example in controllers/user.js
:
exports.get = function (req, res, next) {
User.find({where: req.query.name}).success(function (user) {
res.send(200, user);
});
};
exports.put = function (req, res, next) {
User.create(req.body).success(function (user) {
res.send(201, user.id);
});
};
If you want all methods to be process in only one controller(something not RESTful), just make exports to be the handle function:
module.exports = function (req, res, next) {
};
Params
Rainbow started to support param form URL from version 0.1.0. Now you can define your controllers URL with params resolved by native Express like this:
exports.get = function (req, res, next) {
var id = req.params.id;
};
exports.get.params = ':id?';
Or you can use regular expression also:
exports.get = function (req, res, next) {
console.log(req.params);
}
exports.get.params = /(\d+)(?:\.\.(\d+))?/;
But make sure no regular expression ^
used as starter and $
as ender, or rainbow could not resolve the expression correctly.
Filters
Make sure the filters you need had been defined in filters/
folder (could be changed) as same module name, because them will be required when initilizing. Here authorization.js
is a example for intecepting by non-authenticated user before GET
http://yourapp:6060/something
:
module.exports = function (req, res, next) {
console.log('processing authorization...');
var session = req.session;
if (session.userId) {
console.log('user(%d) in session', session.userId);
next();
} else {
console.log('out of session');
db.User.find().success(function (user) {
if (!user) {
res.send(403);
res.end();
}
});
}
};
You could see filters is as same as a origin router in Express, just be put together in filters/
folder to be interceptors like in Java SSH.
Change default path
Controllers and filters default path could be changed by passing a path config object to route
function when initializing:
rainbow.route(app, {
controllers: '/your/controllers/path',
filters: '/your/filters/path'
});
These paths are all RELATIVE to your app path!
Troubleshooting
- Gmail me: mytharcher
- Write a issue
- Send your pull request to me.
MIT Licensed
-EOF-