Randhir Singh
Randhir Singh

Reputation: 245

Sails js: How can I use service method in policy

I am using sails v0.10. I made a service inside the /service/Utility.js and I want to use the Ulitity.js method inside the /policies/addWhere.js I want to know is it possible to use service in policy.

My Utility.js is looks like:

var util = require('util'),
      _ = require('lodash');

module.exports = {

  getRequestAction: function (req) {
    if (req.options.action) return req.options.action;

    var controller = req.options.controller || req.options.model;

    var baseRoute = sails.config.blueprints.prefix + controller;
    var requestRoute = req.route.method + ' ' + req.route.path;

    var Model = sails.models[controller];

    if (req.options.shortcuts && Model) {
      var shortcutRoutes = {
        '/%s/find/:id?': 'find',
        '/%s/create': 'create',
        '/%s/update/:id?': 'update',
        '/%s/destroy/:id?': 'destroy'
      };

      var shortcutAction = _.findWhere(shortcutRoutes, function(blueprint, pattern){
        var shortcutRoute = util.format(pattern, baseRoute);
        return req.route.path === shortcutRoute;
      });

      if (shortcutAction) return shortcutAction;
    }

    if (req.options.rest && Model) {
      var restRoutes = {
        'get /%s/:id?': 'find',
        'post /%s': 'create',
        'put /%s/:id?': 'update',
        'delete /%s/:id?': 'destroy'
      };

      var restAction =_.findWhere(restRoutes, function(blueprint, pattern){
        var restRoute = util.format(pattern, baseRoute);
        return requestRoute === restRoute;
      });

      if (restAction) return restAction;

      var associationActions = _.compact(_.map(req.options.associations, function(association){
        var alias = association.alias;

        var associationRoutes = {
          'get /%s/:parentid/%s/:id?': 'populate',
          'post /%s/:parentid/%s': 'add',
          'delete /%s/:parentid/%s': 'remove'
        };

        return _.findWhere(associationRoutes, function(blueprint, pattern){
          var associationRoute = util.format(pattern, baseRoute, alias);
          return requestRoute === associationRoute;
        });
      }));

      if (associationActions.length > 0) return associationActions[0];
    }
  }
};

And the addWhere.js is like:

 var Utility=require('util');
  module.exports = function(req, res, next) {
      var action = Utility.getRequestAction(req);
      console.log("Request action is", action);
    }
      next();
  };

But when I tried to execute it ,returns the error:

error: Sending 500 ("Server Error") response: 
 TypeError: Object #<Object> has no method 'getRequestAction'
    at module.exports (/var/www/sails/LayupSailsServer/api/policies/addWhere.js:7:26)
    at routeTargetFnWrapper (/var/www/sails/LayupSailsServer/node_modules/sails/lib/router/bind.js:178:5)
    at callbacks (/var/www/sails/LayupSailsServer/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
    at param (/var/www/sails/LayupSailsServer/node_modules/sails/node_modules/express/lib/router/index.js:138:11)
    at pass (/var/www/sails/LayupSailsServer/node_modules/sails/node_modules/express/lib/router/index.js:145:5)
    at nextRoute (/var/www/sails/LayupSailsServer/node_modules/sails/node_modules/express/lib/router/index.js:100:7)
    at callbacks (/var/www/sails/LayupSailsServer/node_modules/sails/node_modules/express/lib/router/index.js:167:11)
    at /var/www/sails/LayupSailsServer/node_modules/sails/lib/router/bind.js:186:7
    at module.exports (/var/www/sails/LayupSailsServer/api/policies/isAuthorized.js:6:5)
    at routeTargetFnWrapper (/var/www/sails/LayupSailsServer/node_modules/sails/lib/router/bind.js:178:5) [TypeError: Object #<Object> has no method 'getRequestAction']

I want to know what's the wrong am doing.

Upvotes: 0

Views: 1488

Answers (3)

zieglar
zieglar

Reputation: 830

addWhere.js

ServiceFileName.action to call

module.exports = function(req, res, next) {
  var action = Utility.getRequestAction(req);
  console.log("Request action is", action);
};

Utility.js (because lodash is global object in sails)

var util = require('util');

module.exports = {

  getRequestAction: function (req) {

Upvotes: 0

Fermin Yang
Fermin Yang

Reputation: 606

Try this:

var Utility = require('../services/util');
module.exports = function(req, res, next) {
  var action = Utility.getRequestAction(req);
  console.log("Request action is", action);
}
next();
};

Upvotes: 1

Martin Malinda
Martin Malinda

Reputation: 1608

The service looks fine to me, even though it seems to me theres a lot of reinventing the wheel going on there.

The error is imho in this:

var Utility=require('util');

You basically override the service with this line of code with a util object. For the clarity of code, I would reccomend naming policies with a Service suffix. So in this case utilityService.js instead of Utility.js Then you do utilityService.getRequestAction() anywhere in the code and you dont need to require anything.

But I am quite new to sails as well, so there may be something I dont see.

EDIT: current action and controller name should be accessible through req.options ...sails.log.debug(JSON.stringify(req.options));

Upvotes: 0

Related Questions