node-rules

Business Rules Engine for JavaScript

npm install node-rules
11 downloads in the last week
20 downloads in the last month

Node-rules

About

Node-rules is a forward chaining Rules Engine, written on node.js.

Rules

Node-rules takes rules written in JSON format as input. These rules get applied on the specified iputs(facts) to the rule engine.

A Rules consist of

  1. name - the name for the rule

  2. conditions - a function which takes inputs and upon returning its results the rule engine executes the corresponding consequence.

  3. consequence - a function which gets executed accoring to the return value from a condititon after executed.

  4. description - the description for the rule

  5. priority - number which decides the order at which the rule gets applied on the supplied facts.

  6. on - boolean telling whether or not the rule should be considered by the rule engine.

Example rule

{
    "name": "transaction minimum",
    "description": "blocks transactions below value x",
    "priority": 3,
    "on":1,
    "condition":
        function(fact,cb) {
            cb(fact && (fact.transactionTotal < 500));
        },
    "consequence":
        function(cb) {
            console.log("Rule 1 matched for "+this.name+": blocks transactions below value 500. Rejecting payment.");
            this.result = false;
            this.process = true;
            cb();
        }
}

Facts

Facts are those input json values on which the rule engine applies its rule to obtain results. A fact can have multiple attributes.

Example Fact

{
  "userIP": "27.3.4.5",
  "name":"user4",
  "eventRiskFactor":8,
  "userCredibility":2,
  "application":"MOB2",
  "userLoggedIn":true,
  "transactionTotal":400,
  "cardType":"Credit Card",
  "cardIssuer":"VISA",

}

Usage

The example below shows how to use the rule engine to apply a sample rule on a specific fact.


var RuleEngine = require('node-rules');

var rules = [{
        "name": "transaction minimum",
        "description": "blocks transactions below value x",
        "priority": 3,
        "on":1,
        "condition":
            function(fact,cb) {
                cb(fact && (fact.transactionTotal < 500));
            },
        "consequence":
            function(cb) {
                console.log("Rule 1 matched for "+this.name+": blocks transactions below value 500. Rejecting payment.");
                this.result = false;
                this.process = true;
                cb();
            }
    }];

var fact = {
      "userIP": "27.3.4.5",
      "name":"user4",
      "eventRiskFactor":8,
      "userCredibility":2,
      "application":"MOB2",
      "userLoggedIn":true,
      "transactionTotal":400,
      "cardType":"Credit Card",
      "cardIssuer":"VISA",

    };

var R = new RuleEngine(rules);

R.execute(user7,function(result){ 

    if(result.result) 
        console.log("\n-----Payment Accepted for----\n"); 
    else 
        console.log("\n-----Payment Rejected for----\n");

    console.log(result); 

});

Credits

Both the rules and the facts used in this module are based on the node module jools. Its a modified version of jools with a non blocking version of applying the rule engine on the facts. The rule engine logic was been modified sothat the rule executions on separate facts donot block each other.

npm loves you