restfulgoose

REST API Middleware for Mongo

Mongoose - REST - Middleware

Express middleware to create a RESTful API from a mongo database.

Installation

 $npm install mongo_rest

Usage

See example directory for a working server

var app = require('express')();
var mongoose = require('mongoose');
var mongo_rest = require('../mongo_rest.js');
 
//set up a mongoose schema 
var robotSchema = mongoose.Schema({
  name: String,
  type: String,
  favorite_law: Number
});
 
app.use(mongo_rest({
  basepath: 'api', //path that api endpoints will be exposed at.  e.g., localhost/api/collection 
  dbname: 'testdb',
  url: 'mongodb://localhost',
  collections: {
    //by default, this api will be exposed at 'api/robots' 
    robots: {
      methods: ['GET','POST','PUT', 'DELETE'],
      schema: robotSchema,
      path: robotFactory //override the default path and expose api at 'api/robotFactory' 
    }
  }
}));
 
app.listen(8081);

There are two ways to tell mongo_rest about your Mongoose models.
-Pass in Mongoose models directly -Pass in a url and a schema

var robotSchema = mongoose.Schema({
     name: String,
     law: Number
   });
var Robot = mongoose.model('Robot',robotSchema);
 
//both of the following configurations are valid 
 
//... 
app.use(mongo_rest({
methods: ['GET'],
url: 'http://localhost',
collections: {
  robots: {
    methods: ['GET','POST'],
    schema: robotSchema
  }
}
}));
 
// -OR- 
 
//... 
app.use(mongo_rest({
methods: ['GET'],
//do not pass a url in 
collections: {
  robots: {
    methods: ['GET', 'POST'],
    model: Robot
  }
}
}));

Note that both methods cannot be used within the same application. Do not pass a model to one collection and a schema to another.

Optionally pass a function to restigoose that will be used for authorization. Authorization functions are passed on a collection by collection basis and are formatted as standard Connect middleware.

Examples using Passport and a custom function for authentication.

//pass an authorization function to the collection  
collections: {
  //... 
  protectedCollection: {
    methods: ['GET'],
    schema: protectedSchema,
    auth: passport.authenticate('basic', { session: false })  //using a passport Basic Authentication strategy 
  }, 
  secretCollection: {
    methods: ['GET', 'POST', 'PUT', 'DELETE'],
    schema: secretSchema,
    authfunction(reqresnext){ //using a custom user authentication function 
            if (Math.random() > 0.5){
              next();  //call next if user authorized 
            } else {
              res.end("not authorized", 404);  //handle failed user authentication 
            }
        }
  }
}

Pass additional options to a collection

collections: {
    robots: {
      methods: ['GET','POST','PUT', 'DELETE'],
      schema: robotSchema,
      path: robotFactory,
      options: {
        sortBy: '-name' //sort by name in descending order 
        selectFields: ['name', 'favorite_law']  //only return these fields 
      }
    }
  }

##Custom Search Functions Optionally overwrite the function that determines the search query. The serach query takes three arguments, a query, a parsed object from the url string, and a request.

  
robots: {
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  schema: robotSchema,
  searchQueryfunction(queryqueryParamsreq){
    //for example, a mongoose query could be passed in the request 
    if (req.query){
      query[req.query];
    }
  },
  sortOrderfunction(){},
  selectFieldsfunction(){}
}
 

Right now, we can use the url to query the collection for matches.

-GET to /api/robots?name=WallE returns robots with the name WallE -GET to /api/robots?type=vaccuum&favorite_law=3 returns robots of type vacuum whose favorite law is 3