Mongoose-Express-Rest
Mongoose Express Rest is a plugin for express to expose mongoose finders as simple crud/rest operations. The
basic idea being you should just define your model and your finders and the rest should be be magic.
Usage [usage]
var mer = ; app;
Configuration options include uri: mongoose:mongoose, //your mongoose instance. [error][error]:function //your custom error handler. responseStream:function //your custom respost stream See: lib/streams.js transformer:function //your custom transformer factory
If you had a schema such as
var mongoose = Schema = mongooseSchema ObjectId = mongooseSchemaObjectId; var CommentSchema = title:String body:String date:Date; var BlogPostSchema = author:ObjectId title:String body:String buf:Buffer date:Date comments:CommentSchema meta: votes:Number favs:Number ;/*** Note this must return a query object. If it doesn't well, I dunno what it'll do.* @param q* @param term*/BlogPostSchemastatics { return this;}var Comment = moduleexportsComment = mongoose;var BlogPost = moduleexportsBlogPost = mongoose;
you could then access it at listing.
http://localhost:3000/rest/blogpost/
http://localhost:3000/rest/blogpost/$id
http://localhost:3000/rest/blogpost/$id/comments
http://localhost:3000/rest/blogpost/$id/comments/$id
http://localhost:3000/rest/blogpost/$id/comments/0
Pagination
Pagination is also supported via skip= and limit= query params.
http://localhost:3000/rest/blogpost/$id?skip=10&limit=10
Population
Mongoose populate is supported, but this will be changing shortly to allow for more fine grained controll over population. Currently you can do
http://localhost:3000/rest/blogpost?populate=comments
or to specify particular fields.
http://localhost:3000/rest/blogpost?skip=10&populate[comments]=title,date
Filter
Filtering is available for strings. To find all the blog posts with C in the title.
http://localhost:3000/rest/blogpost?filter[title]=C
To filter all String fields that have a C in them
http://localhost:3000/rest/blogpost?filter=C
Sorting
Sorting is supported 1 ascending -1 ascending.
http://localhost:3000/rest/blogpost?sort=title:1,date:-1
Transformer
Transformers can be registered on startup. A simple TransformerFactory is included. Something that takes security into account could be added. Currently this is only supported on the get operations. May change the responses to post to send location, though I find that pretty inconvient.
app;}
to get results transformered just add
http://localhost:3000/rest/blogpost?transform=renameid
It handles get/put/post/delete I'll add some docs on that some day, but pretty much as you expect, or I expect anyways. see tests/routes-mocha.js for examples.
Static Finders
It should also be able to be used with Class finders. Now handles class finders. Note: They must return a query object. They are passed the query object and the rest of the url. All of the populate's, filters, transforms should work.
/** * Note this must return a query object. * @param q * @param term */BlogPostSchemastatics { return this;}
So you can get the url
http://localhost:3000/rest/blogpost/finder/findTitleLike?title=term
or
http://localhost:3000/rest/blogpost/finder/findTitleLike/term
[Error Handling][error]
To create a custom error handler
app
Custom Transformers
You can transform your results by adding a custom transformer and or adding a new TransformerFactory
app
Custom ResultStream
You can create your own result stream. It needs to subclass Stream be writable and needs to have asCallback function.
BufferedJSONStreamprototype { return { if err thisresponseerror = err; thisstatus = 1; else thisresponsepayload = obj; this; tostream; this; };}
Examples.
An example of a customized rest service can be found at
https://github.com/jspears/backbone-directory