【问题标题】:API Call in Rocket.Chat IntegrationRocket.Chat 集成中的 API 调用
【发布时间】:2018-11-04 12:06:01
【问题描述】:

我正在尝试进一步扩展 telegram-rocket.chat 桥,并需要为此调用一些 api。为此,rocket.chat 公开了一个名为 HTTP 的 Meteor.js 包装器。

这段代码 sn-p 是一个传出钩子,它处理用户发送的消息,让我转换消息并传递更改后的文本。

prepare_outgoing_request({request}) 被 Rocket.chat 钩子调用,我想在其中调用一个 API,将表情符号代码解析为实际的表情符号字符:“:see_no_evil: to ????”

/** Global Helpers
 *
 * console - A normal console instance
 * _       - An underscore instance
 * s       - An underscore string instance
 * HTTP    - The Meteor HTTP object to do sync http calls
 *           https://docs.meteor.com/api/http.html
 */


class Script {
    request_emojitext(emoji_code) {
       console.log(`called: request_emojitext('${emoji_code}')`);
       const url = `https://www.emojidex.com/api/v1/emoji/${emoji_code}`;
  
       const response = HTTP.call('GET', url);

       console.log(`Emoji Response: ${response.constructor.name} => ${JSON.stringify(response)}`);
      // Emoji Response: Object => {"error":{}}             
       return response;
    }
  
    /**
    	request.params            {object}
     	request.method            {string}
    	request.url               {string}
    	request.headers           {object}
    	*/
    prepare_outgoing_request({ request }) {
      	const emojiResponse = this.request_emojitext('see_no_evil');
      	const emojiCharacter = emojiResponse.content.emoji;
        
        return {
          // https://core.telegram.org/bots/api
          url: `${request.url}&text=${emojiCharacter}`,
          method: 'GET'
        };
    }
}

Meteor documentation 声明:

// Asynchronous call
Meteor.call('foo', 1, 2, (error, result) => { ... });

// Synchronous call
const result = Meteor.call('foo', 1, 2);

/*
On the client, if you do not pass a callback and you are not 
inside a stub, call will return undefined, and you will have 
no way to get the return value of the method. That is because
the client doesn’t have fibers, so there is not actually any 
way it can block on the remote execution of a method.
*/

我不确定如何在这里进行,因为我对异步编程还不完全满意。在结果实际可用之前我将如何阻止,或者是否有另一种我完全想念的方法?

【问题讨论】:

    标签: javascript meteor rocket.chat asynchronous-javascript


    【解决方案1】:

    我通过查看 HTTP 变量 (PR #5876) 的实现发现了问题。 另外,异步调用的功能请求已打开 (Issue #4775)。

    const response = HTTP('GET', 'https://www.emojidex.com/api/v1/emoji/sweat_smile');

    这会同步执行 API 调用并返回一个结果对象:

    {
      "result": {
        "statusCode": 200,
        "headers": {
          // ...
        },
        "data": {
          "code": "sweat smile",
          "moji": "?",
          // ...
        }
      }
    }

    想看完整代码可以check it out on Git

    【讨论】:

      【解决方案2】:

      就像文档所说的那样,没有办法阻止客户端——浏览器根本没有为此实现任何机制。所以问题是,是什么让您难以处理客户端上的延迟,直到调用回调。当然,典型的模式是在调用时将客户端切换到某种“等待”状态(例如,显示微调器),然后在回调触发时使用结果更新页面(并隐藏微调器)。

      【讨论】:

      • 我害怕那个。它是 Rocket.chat 的集成,因此我无法控制客户端。 Rocket.chats 的限制使我无法继续进行。让我感到困惑的是,它们提供了对一个看似无法使用的 Meteor 库的访问权限来执行 WebRequest。暴露它需要有一个理由。但也许这是在 github 上更好地提出的问题。感谢您的快速回答。
      猜你喜欢
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多