POST请求体为空

5
我正在尝试向知识库发出POST请求。可能只有5-10%的时间我能够从请求中得到正确的响应。其他时候,我会从服务器上收到标题中的错误信息。请保留HTML标记。
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


你确定你的会话不是空的吗?可以使用console.log打印出你的postData来检查一下。 你的代码看起来很简单明了,找不到哪里可能出错了。 - Sigma
API是否可能限制请求速率?您能否使用Postman或其他客户端重现此行为? - Sigma
尝试在bot.dialog('qnaReq',function (session, args) {这一行之后声明你的options对象。 也许内容长度破坏了你的函数。 当你连续两次使用相同的主体调用API时,它似乎是有效的。 - Sigma
我可以连续调用API 20次,使用相同的主体,但只有1次有效,因此与连续2次无关。当我提前设置主体时:var postData = {question: "what is the cloud"}; 出现相同的错误- 没有传递参数。 - Brennan Casey
你能把 var resData = ""; 移到 bot.dialog('qnaReq', function (session, args) { ... } 中吗? - Jannes Botis
显示剩余8条评论
2个回答

0

看起来问题就像这里提到的那样。

尝试使用如这里所述的Content-Length头部。


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 },它被字符串化后就变成了 '{}'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接