fix(sdk): handle api error response code correctly and improve missing token hints

- Fixed an issue where the request function silently resolved on HTTP 200 even when the JSON body contained an API error (e.g. code 401). Now explicitly throws when code != 200.
- Improved error messages when OpenAPI or Notify tokens are completely missing, explicitly instructing the user to configure them in the panel.
This commit is contained in:
duorameng
2026-05-27 17:46:03 +08:00
parent 20d0ab54d1
commit d9f47daf29
5 changed files with 27 additions and 9 deletions
+7 -2
View File
@@ -8,7 +8,7 @@ const { URL } = require('url');
function request(urlStr, method = 'GET', data = null) {
const token = process.env.BHPKG_OPENAPI_TOKEN || process.env.OPENAPI_TOKEN || process.env.BHPKG_NOTIFY_TOKEN;
if (!token) {
throw new Error("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用环境管理操作");
throw new Error("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 环境变量,无法使用环境管理操作");
}
const parsedUrl = new URL(urlStr);
@@ -41,7 +41,12 @@ function request(urlStr, method = 'GET', data = null) {
res.on('end', () => {
if (res.statusCode >= 200 && res.statusCode < 300) {
try {
resolve(body ? JSON.parse(body) : {});
const parsed = body ? JSON.parse(body) : {};
if (parsed && typeof parsed === 'object' && parsed.code !== undefined && parsed.code !== 200) {
reject(new Error(`请求失败 [${parsed.code}]: ${parsed.msg || parsed.message || '未知错误'}`));
} else {
resolve(parsed);
}
} catch (e) {
resolve(body);
}
+1 -1
View File
@@ -13,7 +13,7 @@ function notify(title, text, channelId) {
const missing = [];
if (!token) missing.push("BHPKG_NOTIFY_TOKEN");
if (!channel) missing.push("BHPKG_NOTIFY_CHANNEL");
throw new Error(`缺少必要的环境变量以使用 notify 函数: ${missing.join(", ")}。请在白虎面板的任务设置中配置这些 Key。`);
throw new Error(`没有正确配置或缺少 ${missing.join(" ")} 环境变量以使用 notify 函数。请在白虎面板的任务设置中配置这些 Key。`);
}
const notifyUrl = process.env.BHPKG_NOTIFY_URL || 'http://localhost:8052/api/v1/notify/send';
+7 -2
View File
@@ -8,7 +8,7 @@ const { URL } = require('url');
function request(urlStr, method = 'GET', data = null) {
const token = process.env.BHPKG_OPENAPI_TOKEN || process.env.OPENAPI_TOKEN || process.env.BHPKG_NOTIFY_TOKEN;
if (!token) {
throw new Error("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用任务管理操作");
throw new Error("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 环境变量,无法使用任务管理操作");
}
const parsedUrl = new URL(urlStr);
@@ -41,7 +41,12 @@ function request(urlStr, method = 'GET', data = null) {
res.on('end', () => {
if (res.statusCode >= 200 && res.statusCode < 300) {
try {
resolve(body ? JSON.parse(body) : {});
const parsed = body ? JSON.parse(body) : {};
if (parsed && typeof parsed === 'object' && parsed.code !== undefined && parsed.code !== 200) {
reject(new Error(`请求失败 [${parsed.code}]: ${parsed.msg || parsed.message || '未知错误'}`));
} else {
resolve(parsed);
}
} catch (e) {
resolve(body);
}
+6 -2
View File
@@ -6,7 +6,7 @@ import urllib.error
def _get_headers():
token = os.environ.get("BHPKG_OPENAPI_TOKEN") or os.environ.get("OPENAPI_TOKEN") or os.environ.get("BHPKG_NOTIFY_TOKEN")
if not token:
raise RuntimeError("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用环境管理操作")
raise RuntimeError("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 环境变量,无法使用环境管理操作")
return {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}"
@@ -36,7 +36,11 @@ def _request(url, method="GET", data=None):
body = resp.read().decode("utf-8")
if not body:
return {}
return json.loads(body)
parsed = json.loads(body)
if isinstance(parsed, dict) and parsed.get("code") is not None and parsed.get("code") != 200:
msg = parsed.get("msg") or parsed.get("message") or "未知错误"
raise RuntimeError(f"请求失败 [{parsed.get('code')}]: {msg}")
return parsed
except urllib.error.HTTPError as e:
err_body = e.read().decode("utf-8")
try:
+6 -2
View File
@@ -6,7 +6,7 @@ import urllib.error
def _get_headers():
token = os.environ.get("BHPKG_OPENAPI_TOKEN") or os.environ.get("OPENAPI_TOKEN") or os.environ.get("BHPKG_NOTIFY_TOKEN")
if not token:
raise RuntimeError("缺少 BHPKG_OPENAPI_TOKEN 或 BHPKG_NOTIFY_TOKEN 环境变量,无法使用任务管理操作")
raise RuntimeError("没有正确配置或缺少 BHPKG_OPENAPI_TOKEN 环境变量,无法使用任务管理操作")
return {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}"
@@ -41,7 +41,11 @@ def _request(url, method="GET", data=None):
body = resp.read().decode("utf-8")
if not body:
return {}
return json.loads(body)
parsed = json.loads(body)
if isinstance(parsed, dict) and parsed.get("code") is not None and parsed.get("code") != 200:
msg = parsed.get("msg") or parsed.get("message") or "未知错误"
raise RuntimeError(f"请求失败 [{parsed.get('code')}]: {msg}")
return parsed
except urllib.error.HTTPError as e:
err_body = e.read().decode("utf-8")
try: