通过 IBM Watson Chatbot 触发身份验证

Trigger Authentication through IBM Watson Chatbot

我有一个小型聊天机器人,可以对单词做出反应:"test"。在阅读这个词时,他应该调用一个 IBM Cloud Function,该函数在 return 中尝试注册用户 returning 令牌。问题是,身份验证 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 分钟,但这没有帮助。我也在邮递员中尝试过,在那里我得到了正确的回应。然后我导出 javascript 的请求并修改它以在 Cloud Function 中工作,但它再次 return 是一个空体。

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:
[]

遗憾的是,日志没有显示任何错误消息,因为逻辑上一切正常。

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

您可以优化流程(为什么要花那么长时间?)或将其分为两个操作。第一次调用将启动身份验证,第二次调用检查它是否成功。有一个对话框选项可以在不等待用户输入的情况下告诉用户正在发生某些事情 (skip user input)。使用它来缩短用户通过身份验证的时间。

这是菜鸟 Node.js 的错误。

request 是一个异步调用。正文

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

请求完成时执行。 return

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

应该在这具尸体的旁边。在令牌请求完成之前,您拥有的地方将立即 return 没有令牌。

所以你的代码应该是 -


    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"] }
      };

    });