Reputation: 245
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
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
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
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