1

我正在构建一个非常简单的交互式 BOT,只使用 HTTP-GET 和纯 JS。有时我让 BOT 进行时间密集型处理,需要 40 秒才能回复。在这种情况下,我会收到以下 POST 响应。

  1. 那么,这个回报是预期的吗?

  2. 我做了哪些更改才能收到有意义的响应,而不是将这种情况视为真正的错误?

  3. 处理这种情况的任何其他建议?

谢谢!

502 (Bad Gateway)
{
  "error": {
    "code": "ServiceError",
    "message": "Failed to send activity: bot returned an error"
  }
}

发布请求

//send token and message
function sendMessage() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {


    if (this.readyState == 4 && this.status == 200) {

      var responseObj = JSON.parse(this.responseText);
      convMsgID =responseObj.id;
      latestUserMessage = document.getElementById('textToSend').value;
      showUserMessage();
      document.getElementById('textToSend').value = "";
      getReply();
    }
    else{
      console.log("error :"+ this.responseText);
    }

  };
  var postUrl = "https://directline.botframework.com/v3/directline/conversations/" + convID + "/activities";
  xhttp.open("POST", postUrl, true);

  var authToken="Bearer " + convToken;
  xhttp.setRequestHeader("Authorization", authToken);
  xhttp.setRequestHeader("Content-Type", "application/json");



  var messageBody = '{"type": "message","from": {"id": "user1"},"text": "';
      messageBody =  messageBody + document.getElementById("textToSend").value;
      messageBody = messageBody + '"}';

  console.log("messageBody"+ messageBody);
  xhttp.send(messageBody);
  document.getElementById("send-icon").src="./send.png";

}

获取请求

    function getReply() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {



    if (this.readyState == 4 && this.status == 200) {

      var responseObj = JSON.parse(this.responseText);
      console.log("length" + (responseObj.activities.length -1));
      console.log("response :"+ responseObj.activities[responseObj.activities.length -1].text);
      latestBotMessage = responseObj.activities[responseObj.activities.length - 1].text


      showBotMessage();
    }
    else{
        console.log("response"+ this.responseText);
    }

  };
  var postUrl = "https://directline.botframework.com/v3/directline/conversations/" + convID + "/activities";

  xhttp.open("GET", postUrl, true);

  var authToken="Bearer " + convToken;
  xhttp.setRequestHeader("Authorization", authToken);
 xhttp.send();

}
4

1 回答 1

0

1) 是的,如果机器人需要超过 15 秒的时间来回复,则预计会出现 502

2 & 3) 在开始长时间运行的过程之前响应用户。让一些辅助作业执行长时间操作(Azure 函数?),完成后,将结果作为主动消息发送给用户:https ://docs.microsoft.com/en-us/bot-framework/nodejs/bot- builder-nodejs-proactive-messages

于 2017-09-07T20:09:39.590 回答