Разбор.Cloud.HttpRequest возвращает «неопределенный» вместо ответа с использованием метода POST

#javascript #parse-platform #httprequest #parse-cloud-code #back4app

Вопрос:

Я делаю разбор.Cloud.HttpRequest использует метод POST для извлечения токена из API в функции облачного кода Back4App под названием «retrieveToken».

 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);
  });
});
 

Это прекрасно работает, если я удаляю "project": {"id": "..."} из «области действия» JSON тела HttpRequest.

Однако он возвращает мне «неопределенный», если я не удалю этот фрагмент кода.

Я должен сохранить этот фрагмент кода там, потому что API вернет мне токен уровня проекта, только если я укажу идентификатор проекта. В противном случае я получу токен глобального уровня, который не может быть использован в моем случае.

API отлично работает с/без идентификатора проекта, указанного в Postman.

Я уже застрял здесь на целый день и все еще не могу этого понять. Где я ошибаюсь и как я могу получить правильный ответ от анализа.Cloud.HttpRequest с указанным идентификатором проекта?

Обновить:

Я обнаружил, что длина содержимого ответов сильно отличается с/без идентификатора проекта, указанного с помощью Postman.

«длина содержимого» = 6752 байта без указанного идентификатора проекта

«длина содержимого» = 16896 байт с указанным идентификатором проекта

Случайно ли «неопределенный» был вызван ограничением размера ответа? Если это причина, как я могу получить правильный ответ? Могу ли я получить только заголовок?

Ответ №1:

Частично проблема возникает из-за того, что вы не возвращаете 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;
  });
});
 

Комментарии:

1. Привет, Дэви, на самом деле я просто хочу просмотреть его с помощью консоли. сначала войдите в систему, а затем я сохраню токен в своей базе данных. Таким образом, нет необходимости возвращать HttpResponse. В любом случае, спасибо за ваш ответ XD

Ответ №2:

Эта проблема была решена путем добавления переменной среды на мой сервер Back4App.

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

Я знал точную проблему (переполнение заголовка), используя приведенный ниже код:

 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": "..."
          }
        }
      }
    }
  });
});
 

Только приведенный выше код вернул мне ошибку ниже, а весь остальной код вернул мне «неопределенный»:

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

К вашему сведению: я называю это API

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