Невозможно получить правильный ответ в вызове Get после вызова post в API отдыха лазурного бота в nodejs

Информация о боте

  • Платформа SDK: Node.js
  • Версия SDK: 3.0
  • Активные каналы: прямая линия и т. Д.
  • Среда развертывания: служба Azure Bot, служба приложений Azure с использованием остальных API.

Описание проблемы

Я использую API-интерфейсы для отдыха ботов Azure в своем приложении с помощью node.js. Когда я вызываю метод GET (для получения активности от бота) после вызова POST (для отправки активности от бота), я не получаю ответ текущей активности. Всегда отображается старый ответ. Но если я помещаю функцию задержки между POST и GET, тогда она работает нормально. Что-то мне не хватает? Ниже приведена моя структура вызова API для отдыха в коде.

Пример кода

Вызов 1: GET - для получения идентификатора разговора.
Вызов 2: POST - для отправки активности от бота.
Функция Sleep (1000).
Вызов 3: GET - получение активности от бота.

Код

callStep1();
function callStep1(){
    console.log("Step 1 Start ...");
    Request.post({
        "headers": { "content-type": "application/json" , "Authorization":authBearer },
    "url"  : conversationURL,
}, (error, response, body) => {
    if(error) {
        return console.dir(error);
    }
    if(body !=null && body.length > 0){
    var conversationJSON = JSON.parse(body);
    var conversation_Id  = conversationJSON.conversationId;

    console.log("Conversation ID created and received from MS BOT: " + conversation_Id);

    var activityURL = directline + conversation_Id +"/activities/";
    console.log("Activity URL: " + activityURL);
    console.log("Step 1 completed ...");  
    callStep2(conversation_Id,activityURL);
    }else{
        console.log("Step 2 No body response recieved from the boat ..."); 
    }
});
}

Step 2 get the conversation ID

function callStep2(conversation_Id,activityURL){
console.log("Step 2 Start ...");
Request.post({
"headers": { "content-type": "application/json" , "Authorization":authBearer 
},
"url"  : activityURL,
"body" : JSON.stringify({
    "type": "message",
    "text": textMessage,
    "from": {
      "id": "default-user",
      "name": "Ashish"
    },
    "locale": "en-US",
    "textFormat": "plain",
    "timestamp": new Date().toISOString(),
    "channelData": {
      "clientActivityId": "1"
    },
    "id": "lc9ikcikllnj",
    "recipient": {
      "id": "default-bot",
      "name": "Bot"
    },
    "conversation": {
      "id": conversation_Id
    },
    "serviceUrl": "URL"
  }),
}, (error, response, body) => {
if(error) {
    return console.dir(error);
}
var activityLength = Object.keys(JSON.parse(body)).length;
var jsonObj = JSON.parse(body);

console.log("step-2: 1: " + body);
console.log("step-2: 2: " + activityLength);
var id = JSON.parse(body).id;
console.log("step-2: 3: " + id);
//sleep(5000);
console.log("Step 2 completed ...");

callStep3(id,activityURL)
console.log("Step 2 completed ..." + callStep3(id));
});
}

Calling sleep to make some delay while calling step 3

function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
  if ((new Date().getTime() - start) > milliseconds){
    break;
}
}
}

Step 3 get the conversation Answer from BOT

function callStep3(id,activityURL){
sleep(1000);
console.log("Step 3 start ...");
var botMessage = "";
Request.get({
"headers": { "content-type": "application/json" , "Authorization":authBearer },
"url": activityURL
}, (error, response, body) => {
if(error) {
    return console.dir(error);
}
if(body !=null && body.length > 0){
var activityLength = Object.keys(JSON.parse(body).activities).length;
var jsonObj = JSON.parse(body);

console.log("step-3: body: " + body);
console.log("step-3: activityLength: " + activityLength);

for (i = 0; i < activityLength; i++) {
    if(jsonObj.activities[i].replyToId !=null){
         if(jsonObj.activities[i].replyToId == id){
            botMessage = jsonObj.activities[i].text;
             console.log("step-3: bot text message: " + botMessage);
             break;
         } 
     }
 }
}
else{
    console.log("Step 3: No body received from bot");    
}
 console.log("Step 3 completed ...");
 return botMessage;
},
)

Ожидаемое поведение

После того, как я опубликовал действие, я должен получить правильный ответ на это, хотя бы сразу после вызова GET.


person Dinesh Grewal    schedule 04.07.2018    source источник
comment
Пожалуйста, добавьте подробности о реализации вашего кода   -  person Nicolas R    schedule 04.07.2018
comment
@NicolasR Код обновлен под описанием. Спасибо   -  person Dinesh Grewal    schedule 04.07.2018


Ответы (1)


Вы не создали правильный формат URL-адреса для отправки действия на шаге 1, когда вы получили conversation_id.

Пожалуйста, попробуйте изменить var activityURL = directline + conversation_Id +"/activities/"; на var activityURL = directline + 'conversations/' + conversation_Id + "/activities/"; на шаге 1.

Правильный URL-адрес должен иметь вид https://directline.botframework.com/v3/directline/conversations/{conversationId}/activities, подробнее см. https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct.-line-3-0-send-activity?view=azure-bot-service-3.0.

person Gary Liu    schedule 05.07.2018