Parse.Cloud.httpRequest returns 'undefined' 而不是使用 POST 方法的响应

Parse.Cloud.httpRequest returns 'undefined' instead of a response using POST method

我正在制作 Parse.Cloud.httpRequest 使用 POST 方法从名为 'retrieveToken'.[=16 的 Back4App 云代码函数中的 API 检索令牌=]

Parse.Cloud.define("retrieveToken", async(request) => {
  Parse.Cloud.httpRequest({
    method: 'POST',
    url: 'https://.......',
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: {
      "auth": {
        "identity": {
          "methods": [
            "password"
          ],
          "password": {
            "user": {
              "name": "...",
              "password": "...",
              "domain": {
                "name": "..."
              }
            }
          }
        },
        "scope": {
          "project": {
            "id": "..."
          }
        }
      }
    }
  }).then(function(httpResponse) {
    console.log('Token retrieved successfully, Status Code: ', httpResponse.status, ',\n', httpResponse.text);
  }, function(httpResponse) {
    console.error('Failed to retrieve token, retrieveToken: ', httpResponse.status, ',\n', httpResponse.text);
  });
});

如果我从 httpRequest 的 body JSON 的 'scope' 中删除 "project": {"id": "..."},它工作正常。

但是,如果我不删除那段代码,return我 'undefined'。

我必须将那段代码保留在那里,因为仅当我指定项目 ID 时,API 才会 return 给我一个 project-level 令牌。否则,我将获得一个 global-level 令牌,该令牌不能用于我的案例。

API 完美运行 with/without Postman 中指定的项目 ID。

卡了一天了,还是想不通。我哪里做错了,如何从指定项目 ID 的 Parse.Cloud.httpRequest 获得正确的响应?

更新:

我发现 content-length 的响应完全不同 with/without 使用 Postman 指定的项目 ID。

'content-length' = 6752 字节未指定项目 ID

'content-length' = 16896 字节,指定项目 ID

有没有可能 'undefined' 是由响应大小限制引起的?如果这是原因,我怎样才能得到正确的回应?我可以只收到 header 吗?

部分问题的发生是因为您没有返回 http 响应。试试这个:

Parse.Cloud.define("retrieveToken", (request) => {
  return Parse.Cloud.httpRequest({
    method: 'POST',
    url: 'https://.......',
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: {
      "auth": {
        "identity": {
          "methods": [
            "password"
          ],
          "password": {
            "user": {
              "name": "...",
              "password": "...",
              "domain": {
                "name": "..."
              }
            }
          }
        },
        "scope": {
          "project": {
            "id": "..."
          }
        }
      }
    }
  }).then(function(httpResponse) {
    console.log('Token retrieved successfully, Status Code: ', httpResponse.status, ',\n', httpResponse.text);
    return httpResponse;
  }, function(httpResponse) {
    console.error('Failed to retrieve token, retrieveToken: ', httpResponse.status, ',\n', httpResponse.text);
    return httpResponse;
  });
});

此问题已通过向我的 Back4App 服务器添加环境变量得到解决。

NODE_OPTIONS="--max-http-header-size=16384"

我使用下面的代码知道确切的问题(header 溢出):

Parse.Cloud.define("retrieveToken", async(request) => {
  return Parse.Cloud.httpRequest({
    method: 'POST',
    url: 'https://.......',
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: {
      "auth": {
        "identity": {
          "methods": [
            "password"
          ],
          "password": {
            "user": {
              "name": "...",
              "password": "...",
              "domain": {
                "name": "..."
              }
            }
          }
        },
        "scope": {
          "project": {
            "id": "..."
          }
        }
      }
    }
  });
});

只有上面的代码返回了下面的错误,所有其他代码都返回了我'undefined':

[Error]: Parse Error: Header overflow (Code: 141, Version: 1.19.2)

仅供参考:我称之为 API

https://iam.ap-southeast-1.myhuaweicloud.com/v3/auth/tokens