ember-mongoose
v2.11.0
Published
Mongoose ⇆ Ember-Data
Downloads
73
Readme
Expose mongoose models via an API compliant with the default Ember Rest Adapter
Install
$ npm install ember-mongoose
$ component install kelonye/ember-mongoose
Example
Server
To get started, suppose you have a model, Post
:
// server/models/Post.js
module.exports = new mongoose.Schema(
{
title: String,
content: String
}, {
versionKey: false
}
);
To expose this model, via an API, first define the CRUD
auth hooks as:
// server/api_hooks/pre/Post.js
exports.create = function(req, next){
var err;
if (!(req.isAuthenticated() && req.user)) { // assuming you're using passport.js
err = new Error('not allowed to access this resource');
err.status = 403;
}
console.log(req.body.post);
next(err);
};
exports.read = function(req, next){
next();
};
exports.update = function (req, next){
var err = new Error('not allowed to access this resource');
err.status = 403;
next(err);
};
exports.remove = function (req, next){
var err = new Error('not allowed to access this resource');
err.status = 403;
next(err);
};
You also need to specify the fields to expose as:
// server/api_fields/Post.js
module.exports = [
'title',
'content',
];
Finally, build and mount the API to your Express app:
var join = require('path').join;
var express = require('express');
var db = require('mongoose').createConnection('mongodb://localhost/test');
var em = require('ember-mongoose');
var app = express();
// build api
em()
.models(db, join(__dirname, 'server/models'))
.fields(join(__dirname, 'server/api_fields'))
.hooks(join(__dirname, 'server/api_hooks'));
.discover(app);
app.listen(3000);
With this, you can now access the Post
resource e.g.:
$ curl http://localhost:3000/posts
$ curl
-H "Content-Type: application/json"
-X POST
-d '"post": {{"title":"title","content":""}}'
http://localhost:3000/posts
$ curl http://localhost:3000/posts/1
$ curl
-H "Content-Type: application/json"
-X PUT
-d '"post": {{"title":"title","content":""}}'
http://localhost:3000/posts/1
$ curl -X DELETE http://localhost:3000/posts/1
Client
On client side, assuming you're using component package manager, you can set your app's adapter as:
App.ApplicationAdapter = require('ember-mongoose');
or alternatively, use lib/client/index.js
if not.
Finally, you can then use the Ember-Data
store to perfom API calls, e.g.:
App.Post = DS.Model.extend({
title: DS.attr('string'),
content: DS.attr('string'),
});
// pass query to mongoose
var query =
conditions: {
title: 'title'
},
options: {
skip: 0, // start row
limit: 10, // end row
sort: {
created_at: -1 // order by latest
}
}
};
this
.store
.find('post', query)
.then(function(posts){
console.log(posts);
}, funntion(res){
console.log(res.responseText);
});
// create example
var record = {
title: 'My First Post',
content: '',
};
this
.store
.createRecord('post', record)
.save()
.then(function(post){
console.log(post);
}, funntion(res){
console.log(res.responseText);
});
Get query count
To only retrieve the number of documents in a query, passin the count
option as:
var query =
conditions: {
title: 'title'
},
options: {
count: true
}
};
this
.store
.find('post', query)
.then(function(res){
console.log(res.meta.count);
}, funntion(res){
console.log(res.responseText);
});
For more usage example, see test/support
Test
$ make test