繁体   English   中英

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

[英]How to programmatically call action in ActionHero.js

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

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

在这里值得注意的是,我知道这不是最佳选择,但这涉及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)
})

任务:

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

};

在节点中,这种模式很棒,因为在您的操作等待期间,节点服务器可以处理其他请求。

我不太清楚您的任务示例是否正在排队另一个任务? 什么是api.queue 无论哪种方式,都无法将任务中的价值带回行动。 如果希望客户端进行轮询,则可以让您的任务将来自Java服务器的最终响应存储在Redis或其他地方,然后创建另一个操作,该操作检查密钥是否存在,如果存在则返回它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM