使用app.use在sails.js中设置一些路由

时间:2016-08-30 13:31:13

标签: node.js sails.js

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

问题在于以下内容。这就是应该使用agendash的方式(来自doc):

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,它是未定义的),然后用一些策略来保护这条路线(我希望agendash只对管理员有用)。 如果我做对了,这行应该只运行一次,所以我不能把它作为中间件放在config.http中。但是否则sails.js的路由器将覆盖路由(至少如果我将sails.hooks.http.app.use('/agendash', require('agendash')(agenda))放入钩子中,路由不会被暴露)。

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

2 个答案:

答案 0 :(得分:2)

首先,你不应该在一个钩子中初始化议程,而是在启动时执行一次的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从应用中的任何位置进行访问。

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

答案 1 :(得分:0)

好的,我使用customMiddleware中的config/http.js找到了解决方案,我可以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
            });
        })
    }