Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 1,000,000+ packages pre-installed, including ember-mongoose with all npm packages installed. Try it out:

var emberMongoose = require("ember-mongoose")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

ember-mongoose v2.11.0

Mongoose ⇆ Ember-Data

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

Similar

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free