Reputation: 8292
I try to make an installable hook to make some security verifications so under my hook.js I set :
routes : {
before : {
"/" : function (req, res, view)
{
.....
res.forbidden();
}
}
},
And I have this error if I try to send forbidden page to the user :
error: Sending 500 ("Server Error") response:
TypeError: Object #<ServerResponse> has no method 'view'
at Object.forbidden (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/responses/forbidden.js:56:19)
at ServerResponse.bound [as forbidden] (/usr/local/lib/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
at isRouteAllowed (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/hooks/acl.js:66:18)
at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11)
at pass (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:145:5)
at nextRoute (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:100:7)
at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:167:11)
at /usr/local/lib/node_modules/sails/lib/router/bind.js:187:7
at /usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:35:7
at Object.i18nInit [as init] (/usr/local/lib/node_modules/sails/node_modules/i18n/i18n.js:89:5)
at addLocalizationMethod (/usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:33:11)
at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11) [TypeError: Object #<ServerResponse> has no method 'view']
error: Server Error:
error: TypeError: Object #<ServerResponse> has no method 'view'
at Object.forbidden (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/responses/forbidden.js:56:19)
at ServerResponse.bound [as forbidden] (/usr/local/lib/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
at isRouteAllowed (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/hooks/acl.js:66:18)
at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11)
at pass (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:145:5)
at nextRoute (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:100:7)
at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:167:11)
at /usr/local/lib/node_modules/sails/lib/router/bind.js:187:7
at /usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:35:7
at Object.i18nInit [as init] (/usr/local/lib/node_modules/sails/node_modules/i18n/i18n.js:89:5)
at addLocalizationMethod (/usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:33:11)
at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11) [TypeError: Object #<ServerResponse> has no method 'view']
I'm under sails 0.11.0. I don't use policies cause policies apply only for controller action and I want to make ACL for view, controller and more...
All source code available here : https://github.com/jaumard/sails-hook-user-acl
For now I use : res.status(403).send("<h1>" + req.__("Forbidden") + "</h1>");
instead of res.forbidden();
but it would be nice to send a view
Upvotes: 1
Views: 864
Reputation: 8292
Just found a workaround :
var _addResViewMethod = require("../sails/lib/hooks/views/res.view.js");
routes : {
before : {
"/office" : function (req, res, view)
{
.....
_addResViewMethod(req, res, function(){
res.forbidden();
});
}
}
},
EDIT : A better way was given by sails team here https://github.com/balderdashy/sails/issues/2799#issuecomment-115333582
// Wait for the router to be initialized
sails.on('router:before', function () {
// Wait for the views hook to load, so that its routes get bound first
// (including the one that mixes in res.view)
sails.after('hook:views:loaded', function () {
// Bind your routes here
sails.router.bind('/office', officeHandler, 'get', {});
});
function officeHandler(req, res) {...res.forbidden()...}
return cb();
});
Upvotes: 1