如何在ActionHero.js中以编程方式调用action



我是新来的ActionHero,我有一个需要添加一些东西到队列,等待,直到完成并得到数据回来,然后继续与另一个队列项目之前响应客户端。如下所示:

  1. API客户端点击/foo
  2. foo动作调用bar动作并等待…
  3. 当bar完成时,它返回123abc的值
  4. 然后将
  5. 123abc再次传递给需要它的任务的队列

值得注意的是,我知道这不是最佳的,但这涉及到3个服务器。/foo命中我的Node ActionHero服务器,123abc来自Java服务器(认为它是一个身份验证服务),然后我的Node ActionHero服务器将发送这个被。net服务器捡起。

我现在设置它的方式是一个任务击中Java服务器Java服务器注销我需要的值但是在下面的代码中它是一个空对象

run() in ACTION:

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

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从那里回来被用来追加到下一个队列项目?

如果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();
    });
  }
};

在node中,这种模式非常好,因为当您的操作等待时,节点服务器可以服务其他请求。

我不太清楚你的任务示例是否正在排队另一个任务?api.queue是什么?无论哪种方式,都没有办法将任务的值返回给操作。如果你想让客户端进行POLL,你可以让你的任务将Java服务器的最终响应存储在redis或其他地方,然后创建另一个操作来检查键是否存在,如果存在则返回它。

最新更新