Helper node.js module for expressjs applications usable when building http APIs.
Contains:
- Backbone Models wired to MongoDB
- MongoDB session support using connect-mongo for express apps
- Actions(http request & response handlers)
add in package.json
dependency to "expressApi". then create app.js file with the following:
var app = require("expressApi");
app.configure(function(){
app.useExpressApiMiddleware("databaseName", "cookieSecret");
});
app.addActions(require("./actions/echoActions.js"));
app.listen(8000, function(){
console.log("server started");
})
in ./actions/echoActions.js place actions routes and handlers as follows:
var Actions = require("expressApi/Actions");
var EchoActions = module.exports = Actions.extend({
root: "/",
"POST /echo": function(req, res, next) {},
"GET /echo/:id": function(req, res, next) {},
...
});
to create a Model just place standard Backbone.Model implementation like follows:
var Backbone = require("expressApi/BackboneMongo");
var MyModel = module.exports = Backbone.Model.extend({
collectionName: "myCollection",
defaults: {},
initialize: function(){}
},{
staticMethod: function(){
MyModel.store().find(...);
}
});
to use Model follow Backbone:
var MyModel = require("MyModel");
var instance = new MyModel({ property1: "value1" });
// passing 'null' as first argument should notify Backbone to store all properties
instance.save(function(err, model){
// if there isn't error model == instance, otherwise err is not null
});
- useExpressApiMiddleware(databaseName, cookieSecret)
- addActions({} or ActionsClass)
- save(attributes, options) or save(function(err, model){ ... }); or save(attributes, function(err, model){ ... })
- destroy(options) or destroy(function(err, model){ ... });
- fetch(options) or fetch(function(err, model){ ... });
var MyActions = Actions.extend({
root: "/somePath",
response: function(res) {
// modify express' res object before calling any action
},
request: function(req) {
// modify express' req object before calling any action
},
routes: {
"GET /path": "myMethod",
"POST /path": "myMethod",
"DELETE /path": function(req, res, next) {
// req & res objects are already modified here
}
},
myMethod: function(req, res, next) {
// req & res objects are already modified here
},
"PUT /pathMe": function(req, res, next) {
// the full path to this action is /somePath/pathMe accordingly to root
},
"GET /pathMe/:helloParam": function(req, res, next) {},
"GET /pathMe2/:helloParam": [
function(req, res, next) {
// as before req & res objects are already modified,
// and this method will be invoked first accordingly the array
next(); // call next to invoke the next method ;)
},
function(req, res, next) {
// this will be invoked second accordingly to the array
res.result(true);
}
]
})