如何在arangodb中的后台任务中调用外部函数

Dee*_*wal 3 arangodb

我有一个完全正常工作的功能,我希望每30分钟从后台任务调用一次.但它并没有将错误称为"未定义".

app.js

function hourly() { require("console"); console.log('I am running');}

controller.get('/testOnce', function(req, res) {
    var tasks = require("org/arangodb/tasks");

    tasks.register({
        id : "Test",
        name : "Testing background task",
        period : 5,
        command : "hourly()"
    });
});
Run Code Online (Sandbox Code Playgroud)

我尝试在一个单独的js中定义每小时,然后用'require'调用它但是这个throws无法定位模块'myjob'

myjob.js

function hourly(){require("console"); console.log('我正在运行');

app.js

controller.get('/testOnce', function(req, res) {
var tasks = require("org/arangodb/tasks");

tasks.register({
    id : "Test",
    name : "Testing background task",
    period : 5,
    command : "var job = require('myjob');"
});
Run Code Online (Sandbox Code Playgroud)

});

stj*_*stj 5

command属性的内容不能引用其他范围中定义的变量.例如,在app.js变体中,您正在使用一个名为的变量hourly,该变量在执行命令时可能不再存在.

在仅记录某些内容的简单情况下,如果将app.js变量的command参数更改为以下(不需要任何变量),则可以使其工作:

var tasks = require("org/arangodb/tasks");
tasks.register({
    period : 5,
    command : "require('console').log('I am running from inline command');"
});
Run Code Online (Sandbox Code Playgroud)

myjob.js通过导出该模块使该功能可用,可以使在单独的文件(命名)中定义作业功能的变体工作:

function hourly() { 
  require("console").log('I am running from myjob.js');
}

exports.hourly = hourly;
Run Code Online (Sandbox Code Playgroud)

这是因为a require()只会暴露模块导出的内容.在上面的例子中,模块将公开一个名为的函数hourly,现在可以从后台任务调用,如下所示:

var tasks = require("org/arangodb/tasks");
tasks.register({
    period : 5,
    command : "require('myjob').hourly();"
});
Run Code Online (Sandbox Code Playgroud)

请注意,为了使其正常工作,文件myjob.js需要位于模块搜索路径中.IIRC是js/node默认的.另请注意,此目录已包含捆绑的模块,并且可能会更改ArangoDB更新.

如果要在Foxx路由中执行常规命令,那么使用Foxx队列也可能是一个选项,因为它们应该允许将带有job函数的脚本放在应用程序目录中.但是,我还没有尝试过.