POST请求正文为空或空

时间:2017-07-13 12:31:40

标签: node.js post botframework

我正在尝试向知识库发出POST请求。我可以在5-10%的时间内从请求中得到正确的答复。所有其他时间我从服务器返回标题中的错误:

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

我感觉这是由Node.js异步引起的,当请求通过时我的变量仍未定义。虽然,req.write()包含变量时怎么办?也许我可以插入一个延迟来确保在发送请求之前定义变量?

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

2 个答案:

答案 0 :(得分:0)

这似乎是提到here的问题。

尝试使用Content-Length标题here

答案 1 :(得分:0)

您的代码看起来是正确的。您使用http.request()发出请求并执行req.write()req.end()(请注意,您可以跳过写入部分,只执行req.end(data))。

我认为这里的关键是当您执行req.write()时数据会发生什么:

  

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

您确定session.message.text不是undefined吗?如果是,则postData将为{ question: undefined },其字符串化为'{}'