From 8c970bb52a9b6ef83618b7f1dc2d55fa26045024 Mon Sep 17 00:00:00 2001
From: enncy <877526278@qq.com>
Date: Mon, 16 May 2022 18:50:02 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20AnswererWrapper=20?=
=?UTF-8?q?=E5=8F=82=E6=95=B0:=20headers=20=E5=92=8C=20type?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../core/src/components/SearchResults.tsx | 45 ++++---
packages/core/src/components/index.tsx | 13 +-
packages/core/src/core/utils/common.ts | 55 ++++----
.../src/core/worker/answer.wrapper.handler.ts | 119 +++++++++++-------
4 files changed, 141 insertions(+), 91 deletions(-)
diff --git a/packages/core/src/components/SearchResults.tsx b/packages/core/src/components/SearchResults.tsx
index 0f09afb8..c74a8df9 100644
--- a/packages/core/src/components/SearchResults.tsx
+++ b/packages/core/src/components/SearchResults.tsx
@@ -59,32 +59,41 @@ export const SearchResults = defineComponent({
{currentSearchResults.value?.map((res) => (
+
+
题库:
{res.name}
- 一共有 {res.answers.length} 个答案
+ {res.error ? '此题库请求错误: ' + res.error.message : `一共有 ${res.answers.length} 个答案`}
-
- {res.answers.map((answer) => (
-
-
-
- 题目:
- {StringUtils.of(answer.question).nowrap().max(50).toString()}
-
-
-
-
- 回答:
- {StringUtils.of(answer.answer).nowrap().max(50).toString()}
-
-
+ {res.error
+ ? (
+
+ )
+ : (
+
+ {res.answers.map((answer) => (
+
+
+
+ 题目:
+ {StringUtils.of(answer.question).nowrap().max(50).toString()}
+
+
+
+
+ 回答:
+ {StringUtils.of(answer.answer).nowrap().max(50).toString()}
+
+
+
+ ))}
- ))}
-
+ )}
+
))}
diff --git a/packages/core/src/components/index.tsx b/packages/core/src/components/index.tsx
index 447fda01..57119d9e 100644
--- a/packages/core/src/components/index.tsx
+++ b/packages/core/src/components/index.tsx
@@ -137,8 +137,19 @@ export function createWorkerSetting (
接口: {aw.url}
请求方式: {aw.method}
数据类型: {aw.contentType}
+ 请求类型: {aw.type}
- 请求数据:
+ 请求头:
+
+ {Reflect.ownKeys(aw.headers || {}).map((key) => (
+ -
+ {key.toString()} ={hideToken(aw.headers?.[key.toString()] || '')}
+
+ ))}
+
+
+
+ 请求数据:
{Reflect.ownKeys(aw.data || {}).map((key) => (
-
diff --git a/packages/core/src/core/utils/common.ts b/packages/core/src/core/utils/common.ts
index 09549ed7..b62f18d5 100644
--- a/packages/core/src/core/utils/common.ts
+++ b/packages/core/src/core/utils/common.ts
@@ -112,44 +112,51 @@ export function waitForRecognize() {
* @param opts 请求参数
*/
export function request(url: string, opts: {
+ type: 'fetch' | 'GM_xmlhttpRequest',
method?: 'get' | 'post';
headers?: Record;
contentType?: 'json' | 'text',
body?: string
}): Promise {
return new Promise((resolve, reject) => {
- const { contentType = 'json', body, method = 'get', headers = {} } = opts || {};
+ /** 默认参数 */
+ const { contentType = 'json', body, method = 'get', headers = {}, type = 'fetch' } = opts || {};
+ /** 环境变量 */
+ const env = isInBrowser() ? 'browser' : 'node';
- const env = typeof GM_xmlhttpRequest !== 'undefined' ? 'GM' : isInBrowser() ? 'browser' : 'node';
-
- console.log('request', { url, opts, env });
-
- if (env === 'GM') {
- // eslint-disable-next-line no-undef
- GM_xmlhttpRequest({
- method: opts.method?.toLocaleUpperCase() as any || 'GET',
- url,
- data: JSON.stringify(body || {}),
- headers: opts.headers || {},
- responseType: 'json',
- onload: (response) => {
- if (contentType === 'json') {
- resolve(JSON.parse(response.responseText));
- } else {
- resolve(response.responseText);
- }
- },
- onerror: reject
- });
+ /** 如果是跨域模式并且是浏览器环境 */
+ if (type === 'GM_xmlhttpRequest' && env === 'browser') {
+ if (typeof GM_xmlhttpRequest !== 'undefined') {
+ // eslint-disable-next-line no-undef
+ GM_xmlhttpRequest({
+ method: opts.method?.toLocaleUpperCase() as any || 'GET',
+ url,
+ data: JSON.stringify(body || {}),
+ headers: opts.headers || {},
+ responseType: 'json',
+ onload: (response) => {
+ if (contentType === 'json') {
+ resolve(JSON.parse(response.responseText));
+ } else {
+ resolve(response.responseText);
+ }
+ },
+ onerror: reject
+ });
+ } else {
+ reject(new Error('GM_xmlhttpRequest is not defined'));
+ }
} else {
- const fet: (...args: any[]) => Promise = env === 'browser' ? fetch : require('node-fetch').default;
+ const fet: (...args: any[]) => Promise = env === 'node' ? require('node-fetch').default : fetch;
fet(url, { contentType, body, method, headers }).then(async (response) => {
if (contentType === 'json') {
resolve(await response.json());
} else {
resolve(await response.text());
}
- }).catch(reject);
+ }).catch((error) => {
+ reject(new Error(error));
+ });
}
});
}
diff --git a/packages/core/src/core/worker/answer.wrapper.handler.ts b/packages/core/src/core/worker/answer.wrapper.handler.ts
index ce2e8a43..62707d7d 100644
--- a/packages/core/src/core/worker/answer.wrapper.handler.ts
+++ b/packages/core/src/core/worker/answer.wrapper.handler.ts
@@ -18,6 +18,8 @@ export interface SearchResult {
/** 请求响应内容 */
response: any
data: any
+ /** 错误数据 */
+ error?: Error
}
/**
@@ -30,10 +32,16 @@ export interface AnswererWrapper {
name: string
/** 题库网址 */
homepage?: string
+ /** 请求数据 */
data?: Record
+ /** 请求方法 */
method: 'post' | 'get'
/** 定义 handler 中的参数类型 */
contentType: 'json' | 'text'
+ /** 请求模式 */
+ type: 'fetch' | 'GM_xmlhttpRequest',
+ /** 附带请求头 */
+ headers: Record,
/**
* 此选项是个字符串, 使用 [Function(string)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function) 构造方法进行解析生成方法
*
@@ -100,60 +108,75 @@ export async function defaultAnswerWrapperHandler(
const searchResults: SearchResult[] = [];
for (const wrapper of answererWrappers) {
- let answers: Answer[] = [];
- let response: Response | undefined;
+ try {
+ let answers: Answer[] = [];
+ let response: Response | undefined;
- const data = Object.create({});
- wrapper.data = wrapper.data || {};
- /** 构造一个请求数据 */
- Reflect.ownKeys(wrapper.data).forEach((key) => {
- if (wrapper.data) {
- // 解析data数据
- Reflect.set(data, key, resolvePlaceHolder(wrapper.data[key.toString()]));
- }
- });
- /** 解析 url 数据 */
- let url = resolvePlaceHolder(wrapper.url);
+ const data = Object.create({});
+ wrapper.data = wrapper.data || {};
+ /** 构造一个请求数据 */
+ Reflect.ownKeys(wrapper.data).forEach((key) => {
+ if (wrapper.data) {
+ // 解析data数据
+ Reflect.set(data, key, resolvePlaceHolder(wrapper.data[key.toString()]));
+ }
+ });
+ /** 解析 url 数据 */
+ let url = resolvePlaceHolder(wrapper.url);
- /** 请求參數 */
- url = wrapper.method === 'post' ? url : url + '?' + new URLSearchParams(data).toString();
- // 发送请求
- const responseData = await request(url, {
- method: wrapper.method,
- contentType: wrapper.contentType,
- body: wrapper.method === 'post' ? JSON.stringify(data) : undefined
- });
- /** 从 handler 获取搜索到的题目和回答 */
+ /** 请求參數 */
+ url = wrapper.method === 'post' ? url : url + '?' + new URLSearchParams(data).toString();
+ // 发送请求
+ const responseData = await request(url, {
+ method: wrapper.method,
+ contentType: wrapper.contentType,
+ body: wrapper.method === 'post' ? JSON.stringify(data) : undefined,
+ type: wrapper.type,
+ headers: wrapper.headers
+ });
+ /** 从 handler 获取搜索到的题目和回答 */
- if (wrapper.handler) {
- // eslint-disable-next-line no-new-func
- const info = Function(wrapper.handler)()(responseData);
- if (info && Array.isArray(info)) {
- /** 如果返回一个二维数组 */
- if (info.every((item: any) => Array.isArray(item))) {
- answers = answers.concat(
- info.map((item: any) => ({
- question: item[0],
- answer: item[1]
- }))
- );
- } else {
- answers.push({
- question: info[0],
- answer: info[1]
- });
+ if (wrapper.handler) {
+ // eslint-disable-next-line no-new-func
+ const info = Function(wrapper.handler)()(responseData);
+ if (info && Array.isArray(info)) {
+ /** 如果返回一个二维数组 */
+ if (info.every((item: any) => Array.isArray(item))) {
+ answers = answers.concat(
+ info.map((item: any) => ({
+ question: item[0],
+ answer: item[1]
+ }))
+ );
+ } else {
+ answers.push({
+ question: info[0],
+ answer: info[1]
+ });
+ }
}
}
- }
- searchResults.push({
- url: wrapper.url,
- name: wrapper.name,
- homepage: wrapper.homepage,
- answers,
- response,
- data: responseData
- });
+ searchResults.push({
+ url: wrapper.url,
+ name: wrapper.name,
+ homepage: wrapper.homepage,
+ answers,
+ response,
+ data: responseData
+ });
+ } catch (error) {
+ console.error('请求失败: ', { error });
+ searchResults.push({
+ url: wrapper.url,
+ name: wrapper.name,
+ homepage: wrapper.homepage,
+ answers: [],
+ response: undefined,
+ data: undefined,
+ error: error as any
+ });
+ }
}
function resolvePlaceHolder(str: string) {