如何以编程方式调用ActionHero.js中的操作

时间:2016-08-26 22:30:30

标签: node.js actionhero

我是ActionHero的新手,我需要在队列中添加一些内容,等到完成后再获取数据,然后在响应客户端之前继续使用另一个队列项。看起来像这样:

  1. API客户端点击/ foo
  2. foo动作调用bar动作并等待......
  3. 当bar完成后,它返回值123abc
  4. 然后
  5. 123abc再次传递给队列以完成需要它的任务
  6. 值得注意的是,我知道这不是最佳选择,但这涉及3台服务器。 / foo命中我的Node ActionHero服务器,123abc来自Java服务器(将其视为身份验证服务),然后我的Node ActionHero服务器将发送它以供.NET服务器接收。

    我现在用任务设置它的方式确实击中了Java服务器,Java服务器在我下面的代码中记录了我需要的值但是是一个空对象

    ACTION中的run():

    api.actions.enqueue('MyJavaServerTask', {...}, function(error, toRun){
      console.log(arguments) // <-- returns { '0': null, '1': true }
      data.response.success = true
      api.queue.push(data, next)
    })
    

    TASK:

    exports.task = {
      name: 'MyJavaServerTask',
      description: 'My Java Server Task',
      frequency: 0,
      queue: 'default',
      run: function (api, params, next) {
        var job = {
          response: {},
          connection: {id: 'none'},
          authorization: params.authorization,
          params: {
            apiVersion: '1',
            action: 'MyJavaServerTask',
            ...
          }
        }
        api.queue.push(job, function() {
          console.log(arguments) // <-- returns {}
          next()
        })
      }
    }
    

    然而,在Java服务器上,我看到请求并且它成功并返回正确的JSON。该日志似乎是

    15:19:22.542 [run-main-0] INFO  application - apiq read: {"id":"none","params":{"apiVersion":"1","action":"MyJavaServerTask"}}
    generating tables and key
    15:19:22.543 [run-main-0] INFO  application - result: {"key":"..."}
    

    那么......我如何从那里获得key以用于附加到下一个队列&#d; d项?

1 个答案:

答案 0 :(得分:2)

如果API客户端期望来自Java后端的synchronous响应,为什么不从操作中调用请求?

exports.foo = {
  name: 'foo',
  description: 'foo',
  outputExample: {},
  inputs: {}

  run: function(api, data, next){
    var request = require('request);
    request.get('bar.com/bar', function(error, response){
       if(error){ return next(error); }
       var body = JSON.stringify(response.body);
       data.response = body;
       return next();
    });
  }

};

在节点中,此模式很棒,因为当您的操作正在等待时,节点服务器可以提供其他请求。

我无法确定您的任务示例是否将其他任务排入队列?什么是api.queue?无论哪种方式,都无法将任务中的值返回到操作。如果您希望客户端进行POLL,您可以让任务存储来自Java服务器的redis或其他地方的最终响应,然后创建另一个检查密钥是否存在的操作,如果存在则返回它。