feathers-waterline is a database adapter for the Waterline ORM, the ORM used by SailsJS. For detailed Waterline documentation, see the waterline-docs repository. Currently Waterline supports the following data stores:


npm install --save sails-postgresql waterline feathers-waterline

ProTip: You also need to install the waterline database adapter for the DB you want to use.

Getting Started

feathers-waterline hooks a Waterline Model up to a configured data store as a feathers service.

const Message = require('./models/message');
const config = require('./config/waterline');
const Waterline = require('waterline');
const service = require('feathers-waterline');

const ORM = new Waterline();

ORM.initialize(config, function(error, data) {
    app.use('/messages', waterlineService({
      Model: data.collections.message


Creating a new Waterline service currently offers the following options:

  • Model (required) - The Waterline model definition
  • id (default: id) [optional] - The name of the id property
  • paginate [optional] - A pagination object containing a default and max page size (see the Pagination chapter)

Complete Example

Here is an example of a Feathers server with a messages Waterline Model using the Disk store:

$ npm install feathers feathers-rest feathers-socketio body-parser waterline sails-disk feathers-waterline
const feathers = require('feathers');
const rest = require('feathers-rest');
const socketio = require('feathers-socketio');
const bodyParser = require('body-parser');
const Waterline = require('waterline');
const diskAdapter = require('sails-disk');
const service = require('feathers-waterline');

const ORM = new Waterline();
const config = {
  adapters: {
    'default': diskAdapter,
    disk: diskAdapter
  connections: {
    myLocalDisk: {
      adapter: 'disk'
  defaults: {
    migrate: 'alter'
const Message = Waterline.Collection.extend({
  identity: 'message',
  schema: true,
  connection: 'myLocalDisk',
  attributes: {
    text: {
      type: 'string',
      required: true

    complete: {
      type: 'boolean'

// Create a feathers instance.
const app = feathers()
  // Enable REST services
  // Enable Socket.io services
  // Turn on JSON parser for REST services
  // Turn on URL-encoded parser for REST services
  .use(bodyParser.urlencoded({ extended: true }));

ORM.initialize(config, (error, data) => {
  if (error) {

  // Create a Waterline Feathers service with a default page size of 2 items
  // and a maximum size of 4
  app.use('/messages', service({
    Model: data.collections.message,
    paginate: {
      default: 2,
      max: 4

  app.use(function(error, req, res, next){

  // Create a dummy Message
    text: 'Server message',
    complete: false
  }).then(function(message) {
    console.log('Created message', message.toJSON());

  // Start the server
  const server = app.listen(3030);
  server.on('listening', function() {
    console.log('Feathers Message waterline service running on');

results matching ""

    No results matching ""