- >我使用风帆0.10.9
我试图根据路由和控制器名称加载客户端javascript,我想在包含它之前控制文件是否存在。
我以为我可以用
req.options.controller
req.options.action
在http.js中使用中间件,但它总是空的。
那么,你觉得我该怎么做?目的是注入javascript文件(如果存在)。我尝试过以下政策:
'*': 'loadScript'
但它不会在/
之外的其他页面上加载任何帮助都会非常感激
答案 0 :(得分:0)
政策是正确的解决方案;您必须记住的关于策略的事情只是它们仅适用于控制器操作,而不适用于视图。因此,如果您有 config / routes.js 文件:
"/myPage": {view: "myView"}
当您访问 / myPage 时,该政策将不适用。相反,你可以这样做:
"/myPage": "StaticController.myView"
并在 api / controllers / StaticController.js :
myView: function (req, res) {
res.view("myView");
}
然后将应用该政策。
答案 1 :(得分:0)
好的,感谢@ scott-gress带领我走向好路,我就是这样做的。
在api/policies/serveStatic.js
var fs = require('fs');
module.exports = function(req, res, next) {
if(fs.existsSync(sails.config.local_config.js_dir_path + '/' + req.options.controller + '/common.js'))
res.locals.scripts.push(sails.config.local_config.js_public_path+ '/' + req.options.controller + '/common.js')
if(fs.existsSync(sails.config.local_config.css_dir_path + '/' + req.options.controller + '/common.css'))
res.locals.styles.push(sails.config.local_config.css_public_path+ '/' + req.options.controller + '/common.css')
if(fs.existsSync(sails.config.local_config.js_dir_path + '/' + req.options.controller + '/' + req.options.action + '.js'))
res.locals.scripts.push(sails.config.local_config.js_public_path+ '/' + req.options.controller + '/' + req.options.action + '.js')
if(fs.existsSync(sails.config.local_config.css_dir_path + '/' + req.options.controller + '/' + req.options.action + '.css'))
res.locals.styles.push(sails.config.local_config.css_public_path+ '/' + req.options.controller + '/' + req.options.action + '.css')
next();
};
并在config/policies.js
UserController: {
'*': ['isAuthenticated', "serveStatic"]
},
之后,在views/layout.ejs
文件的末尾:
<% if(res.locals.scripts) { %>
<% res.locals.scripts.forEach(function(script, i ) { %>
<script src="<%= script %>" ></script>
<% }) %>
<% }%>
这样做的好处是,在任何操作中,如果我愿意,我可以添加自己的js脚本(或css)。