【问题标题】:Using app.use to set up some routes in sails.js使用 app.use 在sails.js 中设置一些路由
【发布时间】:2016-08-30 13:31:12
【问题描述】:

首先,上下文。我正在使用agenda 在我的sails.js 应用程序中安排任务。在 orm 和其他一些钩子完成之后,议程开始于一个钩子。到目前为止一切都很好。然后我发现了agendash,这是一个用于管理议程任务的 Web 界面。而且我无法让它与sails.js一起使用。

问题出在下面。这就是应该如何使用议程(来自文档):

var express = require('express');
var app = express();

// ... your other express middleware like body-parser

var Agenda = require('agenda');
var Agendash = require('agendash');

var agenda = new Agenda({mongo: 'mongodb://127.0.0.1/agendaDb'});
app.use('/agendash', Agendash(agenda));

我找不到我应该把它放在哪里。正如我所说,议程在挂钩中初始化,然后我将其保存为sails.agenda。所以我唯一真正需要做的就是

app.use('/agendash', require('agendash')(sails.agenda)) 

但我不确定如何在routes.js 之外添加这样的新路由(我不能在该文件中引用sails,它是未定义的),然后用一些策略保护这条路由(我希望议程仅对管理员可用)。 如果我做对了,这条线应该只运行一次,所以我不能把它放在config.http 作为中间件。但是否则sails.js的路由器会覆盖路由(至少如果我把sails.hooks.http.app.use('/agendash', require('agendash')(agenda))放在一个钩子里,路由不会暴露)。

那么我应该怎么做才能让它发挥作用呢?

【问题讨论】:

    标签: node.js sails.js


    【解决方案1】:

    首先,您不应在挂钩中初始化议程,而是在启动时执行一次的config/bootstrap.js 中初始化议程。然后创建一个名为 config/myApp.js 的文件,在其中放置全局变量:

    /**
     * Expose global variables.
     */
    module.exports.myApp = {
        agenda: null
    };
    

    config/bootstrap.js 中你设置了这个变量一次:

    var Agenda = require('agenda');
    sails.config.myApp.agenda = new Agenda({mongo: 'mongodb://127.0.0.1/agendaDb'});
    

    现在您可以参考议程,并且可以使用 sails.config.myApp.agenda 从应用中的任何位置进行访问。

    要注册议程路线,您必须使用自定义 middelware,如此处How to use custom route middleware with Sails.js? (ExpressJS) 所述,并在此处讨论https://github.com/balderdashy/sails/issues/814

    【讨论】:

    • 我终于成功了。但首先我想评论一下:我认为您建议的前两件事有些过分:您实际上不需要在config/bootstrap.js 中添加任何内容,也不需要应用程序的配置文件。此外,钩子也只运行一次,因此它们可以用于启动议程的任务。问题是我不能在那里app.use。我通过在config/http.js 中使用customMiddleware 找到了解决方案,我可以在其中执行app.use,通过中间件保护路由并最终调用Agendash(agenda)(req, res, next)
    • 所以我认为您的回答是在推动,但距离提供解决方案还很远。此外,您并没有真正解释任何事情(例如为什么我不应该使用钩子?)。您也没有回答如何使用策略保护路由的问题(我没有使用控制器,所以config/policies.js 不是一个选项)。所以我觉得我不能接受你的答案,但我也不觉得自己写是正确的,我最终找到了(和上面描述的)。
    • @amberv 如果您找到了更适合您的解决方案,请分享。我确信有多种方法可以解决这个问题。
    【解决方案2】:

    好的,我通过在config/http.js 中使用customMiddleware 找到了解决方案,我可以在其中执行app.use,通过中间件保护路由并最终调用Agendash(agenda)(req, res, next)。 为此,我必须将议程初始化移出钩子并将其放入customMiddleware。这是我的代码的样子:

        customMiddleware: function(app){
            var Agenda = require("agenda");
            var Agendash = require('agendash')
            var agenda = new Agenda({db: {address: 'localhost:27017/dbName', collection: 'collectionName'}});
            //protect the route with several policies
            app.use('/agendash', function(req, res, next){
                require('../api/policies/policy1')(req, res, function(){
                    require('../api/policies/policy2')(req, res, function(){
                        require('../api/policies/policy3')(req, res, function(){
                                Agendash(agenda)(req, res, next)
                            }
                        )
                    })
                })
            });
            sails.agenda = agenda; //saving the reference
            agenda.on('ready', function(){
                var eventsToWaitFor = ['hook:orm:loaded', 'hook:email:loaded'];//if need to wait for some events before starting tasks
                sails.after(eventsToWaitFor, function(){
                    require('./../api/services/jobs')(agenda);//loading all the jobs
                    agenda.on('fail', function(err, job){
                        //log error here
                    });
                    agenda.every('10 minutes', 'task1');//schedule tasks
                    agenda.every('10 minutes', 'task2');
                    agenda.start();//start agenda
                });
            })
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2014-05-11
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      相关资源
      最近更新 更多