2017-07-13 38 views
5

Próbuję wysłać żądanie POST do bazy wiedzy. Mogę uzyskać prawidłową odpowiedź z prośby może 5-10% czasu. Wszystkie pozostałe czasy pojawia się błąd w tytule z serwera:Treść żądania POST jest pusta lub pusta

No argument passed{“Error”:{“Code”:“BadArgument”,“Message”:“Request body Is Null or Empty.”}} 

mam wrażenie, jest to spowodowane przez node.js będąc asynchronicznej i moja zmienna pozostaje niezdefiniowana, gdy żądanie przechodzi. Chociaż, jak to możliwe, gdy req.write() zawiera zmienną? Może mogę wprowadzić opóźnienie, aby upewnić się, że zmienna jest zdefiniowana przed wysłaniem żądania?

var https = require('https'); 

var resData = ""; 

var options = { 
    host: "westus.api.cognitive.microsoft.com", 
    port: 443, 
    path: "/qnamaker/v2.0/knowledgebases/<kb-key>/generateAnswer", 
    method : 'POST', 
    headers: { 
     'Content-Type': 'application/json', 
     "Ocp-Apim-Subscription-Key":"<sub-key>", 
    }, 
}; 

bot.dialog('qnaReq', function (session, args) { 
    //call QnA Bot and ask that bot the question 
var req = https.request(options, function(res) { 

    res.on('data', function (chunk) { 
     resData += chunk; 
    }); 

    res.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
    }); 

    res.on('end', function() { 
     if (resData.length != 75) { //75 is the length of the error I get almost every time. This line prevents the application from crashing since I am trying to access values that won't be there. 
     var accessibleData = JSON.parse(resData); 
     session.send(accessibleData["answers"][0]["answer"]); 
     } else { 
      session.send("No argument passed" + resData); 
     } 
     resData = ""; 
    }); 
}); 

    var postData = {question: session.message.text}; 
    console.log(postData); //postData is defined 

    req.write(JSON.stringify(postData)); 
    req.end(); 

}).triggerAction({ 
    matches: 'IT Help' 
}); 

console results

enter image description here

+0

Czy jesteś pewny, że twoja sesja nie ma wartości NULL? Czy możesz konsoli.logować swoje 'postData', aby to sprawdzić. Twój kod wydaje się dość prosty, nie można znaleźć przyczyny błędu. – Sigma

+0

Tak, konsola.log (postData) działa idealnie. Nie jestem do końca pewny, dlaczego mogę wypytać moje wyniki w porządku, a potem spróbować ponownie i nie działa to 15 razy, kiedy go wypróbuję. –

+0

Czy to możliwe, że API ogranicza stawkę żądań? Czy Twoje zachowanie może być reprodukowane z listonoszem lub innym klientem? – Sigma

Odpowiedz

0

To wydaje się być problemem jak wspomniano here.

Spróbuj użyć Content-Length Header jak wspomniano here

0

Twój kod wygląda poprawnie. Wystawiasz żądanie używając http.request() i robisz req.write() i req.end() (zauważ, że możesz pominąć część do zapisu i po prostu zrobić req.end(data)).

Myślę, że kluczem tutaj jest to, co się dzieje z danymi, gdy robisz req.write():

var postData = {pytanie: session.message.text};

Czy jesteś pewien, że session.message.text nie jest undefined? Bo jeśli tak, to postData będzie { question: undefined }, który to łańcuch staje się '{}'.

Powiązane problemy