#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