Mixins for Loopback, to easily disable or setup new remote methods from the model definition file. It works with both Loopback 2 and 3.
npm install --save loopback-setup-remote-methods-mixin
First, modify your server/model-config.json to include the path to this module:
For LB3, mixins should be declared in the _meta.mixins
property. For LB2, mixins should be declared in the mixins
property.
{
"_meta": {
"mixins": [
"loopback/common/mixins",
"loopback/server/mixins",
"../common/mixins",
"./mixins",
"../node_modules/loopback-setup-remote-methods-mixin"
]
}
}
Then you can use the mixin from your model definition files:
...
"mixins": {
"SetupRemoteMethods": {
"disableAllExcept": ["create", "prototype.updateAttributes"],
"addFromFile": "./common/models/mymodel-remotes.js"
}
}
...
List of default remote methods
http://loopback.io/doc/en/lb3/Exposing-models-over-REST.html#predefined-remote-methods
- disable
- disableAllExcept
- relations
- disableAllExcept
- ignoreACL
- add
- add using JSON
- add using a JS file (Deprecated, use addFromFile instead)
- addFromFile
Disable the defined remote methods. For example, to disable the create
and the updateAttributes
remote methods:
"mixins": {
"SetupRemoteMethods": {
"disable": ["create", "prototype.updateAttributes"]
}
}
Allows wildcards with *
(not fully tested though)
Disable all the remote methods, except the defined on the options. For example, to disable all except create
and updateAttributes
remote methods:
"mixins": {
"SetupRemoteMethods": {
"disableAllExcept": ["create", "prototype.updateAttributes"]
}
}
Allows wildcards with *
(not fully tested though)
Allows to setup some options per relation. Currently only disableAllExcept
is supported.
"mixins": {
"SetupRemoteMethods": {
"relations": {
"customer": {
"disableAllExcept": ["create", "get"]
}
}
}
}
Default value: false
This option works together with disable
and disableAllExcept
. If true, it forces to disable the methods, even if they are configured in the ACL to be allowed.
"mixins": {
"SetupRemoteMethods": {
"ignoreACL": true,
"disableAllExcept": ["create", "prototype.updateAttributes"]
}
}
It adds new remote methods to the model. This is similar to what's planned for the Methods section. (Which is not yet implemented. This option will be deprecated when that happens.)
"mixins": {
"SetupRemoteMethods": {
"add": {
"sayHello": {
"accepts": {"arg": "msg", "type": "string"},
"returns": {"arg": "greeting", "type": "string"}
},
"sayBye": {
"accepts": {"arg": "msg", "type": "string"},
"returns": {"arg": "farewell", "type": "string"}
}
}
}
}
Then you can have the methods implemented in your model as usual:
const Promise = require('bluebird');
module.exports = function(Employee) {
Employee.sayHello = msg => {
return new Promise((resolve) => {
resolve('Hello ' + msg);
});
};
Employee.sayBye = msg => {
return new Promise((resolve) => {
resolve('Goodbye ' + msg);
});
};
};
Deprecated, use addFromFile instead.
You can define the name of the methods in the model that will provide the remote method definition.
"mixins": {
"SetupRemoteMethods": {
"add": {
"greet": "remotesDefinitions.greet"
}
}
}
In order to avoid having this definition in the model file, we can have the definition on a different file, let's say we name it remote-methods.js
module.exports = {
greet
};
function greet() {
return {
accepts: {arg: 'msg', type: 'string'},
returns: {arg: 'greeting', type: 'string'},
};
}
Then, on your model, you would need to have something like:
module.exports = function(Employee) {
// Include the definitions in the model for the mixin to be able to get them
Employee.remotesDefinitions = require('./remote-methods');
// The implementation of your remote method
Employee.greet = msg => {
return new Promise((resolve) => {
resolve('Hello ' + msg);
});
};
};
There are some cases that you might want to call a method to return the definition. This happens for example if one of the properties should be calculated.
You can add all the methods from the file:
"mixins": {
"SetupRemoteMethods": {
"addFromFile": "./common/models/employee-remotes.js"
}
}
Or just some of them:
"mixins": {
"SetupRemoteMethods": {
"addFromFile": {
"filename": "./common/models/employee-remotes.js",
"methods": [ "sayHello" ]
}
}
}
The path of the file should be relative to process.cwd()
.
The file (employee-remotes.js
in our example) would contain the remotes definitions:
module.exports = {
sayHello,
sayBye
};
function sayHello() {
return {
accepts: {arg: 'msg', type: 'string'},
returns: {arg: 'greeting', type: 'string'},
};
}
function sayBye() {
return {
accepts: {arg: 'msg', type: 'string'},
returns: {arg: 'farewell', type: 'string'},
};
}
Then, in the model, you will only need the implementation:
module.exports = function(Employee) {
Employee.sayHello = msg => {
return new Promise((resolve) => {
resolve('Hello ' + msg);
});
};
Employee.sayBye = msg => {
return new Promise((resolve) => {
resolve('Goodbye ' + msg);
});
};
};
Disabling remote methods feature is based on the discussion at strongloop/loopback#651.
The code for disable
, disableAllExcept
and ignoreACL
options is based on this gist from ebarault, which was based on another gist from drmikecrowe.