通过IBM Watson Chatbot触发身份验证

时间:2019-08-02 12:15:09

标签: javascript ibm-cloud watson-assistant ibm-cloud-functions

我有一个小型聊天机器人,它对“测试”一词有反应。阅读此词后,他应该调用IBM Cloud Function,该IBM Cloud Function会尝试注册返回令牌的用户。问题在于,认证API大约需要30秒钟才能响应,并且IBM Cloud函数立即执行。所以我的反应总是这样

    {
        "body": {},
        "headers": {"Content-Type": "application/json" },
        "status": 200
    }

But it should actually return the token in the body
    {
        "body": { "token": ... },
    ...
    }

我已经尝试将超时设置为5分钟,但这没有帮助。我在Postman中也尝试过,在那里我得到了正确的答复。然后,我导出了对javascript的请求,并对其进行了修改,使其可以在Cloud Function中运行,但再次返回了空的正文。

var request = require("request");

function main({id=123}) {
    var options = { method: 'POST',
      url: 'ip:port/v1/authentication',
      headers: 
       {
         "Host": "ip:port",
         "Content-Type": "application/json" },
      body: { username: '---', password: '---' },
      json: true };

    var result = { error: "No result was received" };
    request(options, function (error, response, body) {
      if (error) throw new Error(error);
      console.log(`Response body is: ${response.body}`);
      result = { token: response.body.token };
    });


    return {
        statusCode: 200,
        headers: { "Content-Type": "application/json" },
        body: { token: result["token"] }
    };
}

在下面,您可以看到我收到的消息

Activation ID:
...
Results:
{
  "body": {},
  "headers": {
    "Content-Type": "application/json"
  },
  "statusCode": 200
}
Logs:
[]

遗憾的是,由于一切都在逻辑上正常进行,因此日志未显示任何错误消息。

2 个答案:

答案 0 :(得分:1)

调用Cloud Function或Webhook has a limit of 5 seconds时往返的总时间。这是由Watson Assistant强加的,因此更改Cloud Functions中的任何超时都无济于事。

您可以优化流程(为什么花那么长时间?)或将其分为两个动作。第一个呼叫将启动身份验证,第二个呼叫将检查是否成功。有一个对话框选项,告诉用户正在发生某些事情,而无需等待用户输入(skip user input)。用它来桥接用户认证之前的时间。

答案 1 :(得分:1)

这是一个菜鸟Node.js错误。

request是一个异步调用。身体

      if (error) throw new Error(error);
      console.log(`Response body is: ${response.body}`);
      result = { token: response.body.token };

在请求完成时执行。返回

    return {
        statusCode: 200,
        headers: { "Content-Type": "application/json" },
        body: { token: result["token"] }
    };

应该在这个身体旁边。您所拥有的位置将在令牌请求完成之前立即返回没有令牌的位置。

因此您的代码应为-


    request(options, function (error, response, body) {
      if (error) {
        return {
          statusCode: 500,
          body: { error: error }
        };
      }
      console.log(`Response body is: ${response.body}`);
      result = { token: response.body.token };

      return {
        statusCode: 200,
        headers: { "Content-Type": "application/json" },
        body: { token: result["token"] }
      };

    });