首先,上下文。我使用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))
放入钩子中,路由不会被暴露)。
那么我该怎么做才能让它发挥作用呢?
答案 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
});
})
}