Javascript Sailsjs-动态加载js

Javascript Sailsjs-动态加载js,javascript,node.js,sails.js,Javascript,Node.js,Sails.js,-->我使用0.10.9的帆 我正在尝试根据路由和控制器名称加载客户端javascript,并希望在包含该文件之前控制该文件是否存在 我想我可以用 req.options.controller req.options.action 使用http.js中的中间件,但它总是空的 那么,你认为我应该怎么做?目的是注入javascript文件(如果存在)。我尝试了以下策略: '*': 'loadScript' 但它不会加载到除/ 任何帮助都将非常感激政策是正确的解决方案;关于策略,您必须记住的是,它

-->我使用0.10.9的帆

我正在尝试根据路由和控制器名称加载客户端javascript,并希望在包含该文件之前控制该文件是否存在

我想我可以用

req.options.controller
req.options.action
使用http.js中的中间件,但它总是空的

那么,你认为我应该怎么做?目的是注入javascript文件(如果存在)。我尝试了以下策略:

'*': 'loadScript'
但它不会加载到除/


任何帮助都将非常感激

政策是正确的解决方案;关于策略,您必须记住的是,它们只适用于控制器操作,而不适用于视图。因此,如果您的config/routes.js文件中有:

"/myPage": {view: "myView"}
当您访问/myPage时,该策略将不适用。相反,您可以:

"/myPage": "StaticController.myView"
在api/controllers/StaticController.js中:

myView: function (req, res) {
    res.view("myView");
}

然后将应用该策略。

好的,感谢@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();
};
UserController: {
  '*': ['isAuthenticated', "serveStatic"]
},
config/policies.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();
};
UserController: {
  '*': ['isAuthenticated', "serveStatic"]
},
之后,在我的
视图/layout.ejs
文件末尾:

<% if(res.locals.scripts) { %>   
    <% res.locals.scripts.forEach(function(script, i ) { %>
        <script src="<%= script %>" ></script>
     <% }) %>
<% }%>


这样做的好处是,在任何操作中,如果愿意,我都可以添加自己的js脚本(或css)。

这是一个有用的问题。在我工作的一个复杂的应用程序中,我们对每个页面都有依赖性要求,允许对JS进行逐页编译和附加。我没有用Java编写代码,但我发现它非常有用。我可以看到它将如何在一个更大的帆应用程序派上用场。谢谢你的考虑。我还在搜索。为了将来的参考,你能发布你的
loadScript
政策代码吗?你好,谢谢你花时间回答。我不明白你想解释什么。您能更具体一点吗?好的,但再次强调,这只适用于由控制器操作提供的视图,这一点很重要。如果您的config/routes.js中有一个直接指向视图的路由,正如我在回答中所演示的,那么这将不起作用,因为策略不应用于视图,而只应用于操作。您有更好的方法吗?我不认为我会有任何直接指向静态视图的路线,或者我会始终处理控制器操作。这是一个很好的解决方案。我之所以强调这一点,是因为这是一个常见的问题,开发人员创建了一个策略,并对它为什么不应用于他们定义为
“/myRoute”的路由感到困惑:{view:“myView”}
。只要你总是通过控制器,这将是伟大的工作。