首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式调用ActionHero.js中的操作

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

Stack Overflow用户
提问于 2016-08-26 22:30:29
回答 1查看 844关注 0票数 0

我是ActionHero的新手,我需要在队列中添加一些东西,等待它完成并获得数据,然后在响应客户机之前继续处理另一个队列的条目。看起来是这样的:

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

值得注意的是,我知道这不是最优的,但这涉及到3台服务器。/foo访问了我的Node ActionHero服务器,123abc来自于一个Java服务器(把它看作一个身份验证服务),然后我的Node ActionHero服务器将把它发送出去,由一个.NET服务器来获取。

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

运行中的run():

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

任务:

代码语言:javascript
复制
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。它的日志看起来像

代码语言:javascript
复制
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,以便用于追加到下一个队列的条目?

EN

回答 1

Stack Overflow用户

发布于 2016-08-26 22:46:56

如果action希望得到来自Java后端的synchronous响应,那么为什么不直接从操作中调用请求呢?

代码语言:javascript
复制
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或其他地方,然后创建另一个操作,检查键是否存在,如果存在则返回它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39175466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档