AJAX storage plugin for Mio.

npm install mio-ajax
10 downloads in the last week
34 downloads in the last month


Build Status Coverage Status Bower version NPM version Dependency Status

Provides an AJAX storage plugin for Mio.


Using bower:

bower install mio-ajax

Using component:

component install mio/ajax


var User = require('mio').createModel('User');

  .attr('id', { primary: true })

The example above would expect the following API:

GET      /users       // Return a JSON list of all users.
POST     /users       // Creates a new user. Returns JSON of that user.
DELETE   /users       // Destroys all users.
GET      /users/id    // Return a JSON user object.
PUT      /users/id    // Updates existing user. Returns JSON of that user.
DELETE   /users/id    // Destroys user.

Defining Alternative Routes

You can specify alternative routes by passing in a second optional argument to mio-ajax.

The default urls look like:

var urlMap = {
  index:   '',
  count:   '/count',
  create:  '',
  show:    '/:primary',
  update:  '/:primary'
  destroy: '/:primary',

Override them if needed:

User.browser(require('mio-ajax')('/people', {
  show:    '/:username',
  update:  '/:username',
  destroy: '/:username'

This would make it so that the following routes were used:

SHOW    ->  GET /people/:username
UPDATE  ->  PUT /people/:username
DESTROY ->  DEL /people/:username

Retrying requests

You can use the retry function passed to the ajax error event to retry requests.

User.on('ajax error', function(err, retry) {
  if (err.status == 401) {
    refreshAccessToken(function(token) {


ajax request

Emitted before XHR request is sent.

User.on('ajax request', function(req) {
  // req is superagent request object
  req.set('Authorization', 'Bearer 13a9-34b3-a8da-c78d');

ajax response

Emitted after the XHR request is complete.

User.on('ajax response', function(res) {
  var users = res.body.results;
  // Convert JSON string dates into actual dates
  users.forEach(u) {
     u.registeredAt = new Date(u.registeredAt);
  res.body = users;

ajax error

Emitted on XHR error and 4xx or 5xx responses, with an Error as the first argument and a retry function as the second argument.

If executed, the retry function will retry the request and execute the original callback once the request is complete. If a new callback is supplied to retry() then that will be used when the retried request completes.

User.on('ajax error', function(err, retry) {
  if (err.status == 401) {


Special thanks to Ryan Schmukler and Matthew Mueller for code used in mio-ajax taken from modella-ajax.

MIT Licensed

npm loves you