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
我正在制作 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