Search code examples
jsonschemaloopbackjsstrongloop

How to use jsonschema for Loopback remoteMethod?


In my app I want define JSON schemas for custom API.

For example from: http://docs.strongloop.com/display/public/LB/Remote+methods#Remotemethods-Example

module.exports = function(Person){

    Person.greet = function(msg, cb) {
      cb(null, 'Greetings... ' + msg);
    }

    Person.remoteMethod(
        'greet', 
        {
          accepts: <generate definitions from jsonschema>,
          returns: <generate definitions from jsonschema>
        }
    );
};

How to do that?

This is right way?

MY SOLUTION - validation decorator + remote method params with object type

var validate = require('jsonschema').validate;

bySchema = function (schema) {
  return function (func) {

    return function () {
      var data = arguments[0],
        callback = arguments[1];

      var result = validate(data, schema);

      if (result.errors.length > 0) {
        // some errors in request body
        callback(null, {
          success: false,
          error: 'schema validation error',
        });
        return;
      }
      return func.apply(this, arguments);
    };
  };
};

defaultRemoteArguments = {
  accepts: {
    arg: 'data',
    type: 'object',
    http: function(ctx) {
      return ctx.req.body;
    }
  },
  returns: {
    arg: 'data',
    type: 'object',
    root: true
  }
};

Example:

Auth.login = bySchema(require('<path to shcemajson json for this request>'))
  (function(data, cb) {
    // process request
  });
Auth.remoteMethod('login', defaultRemoteArguments);

In this solution contrib loopback explorer will not be useful, because request/response are objects, not fields...


Solution

  • The correct way to do it is to set the type in the returns attribute to the model name. In your case you would write:

    Person.remoteMethod(
            'greet', 
            {
              ...
              returns: {type:'Person', ...}
            }
        );