Skip to content

[Feature Request] 可以增加electron的适配器吗 #11

@Ya-hui

Description

@Ya-hui

你在什么情况下,需要这个功能解决什么问题?

我这边都是electron主进程去请求后台, 渲染进程 是否可以通过 适配器 向electron通信, 我想保留alovajs的所有功能跟electron通信 还不去直接请求后台

你期望的 API 是什么样子的?

import { ipcRenderer } from "electron";
import type { ProgressUpdater } from "alova";

type ElectronResponse = {
  code: number;
  msg: string;
  response: Response | null;
};

interface FetchResponse<T = unknown> {
  status: number;
  statusText: string;
  data: T;
  headers: Record<string, string>;
}

/**
 * Alova Electron 适配器
 *
 * 前端职责:参数格式化 + IPC 转发 + 响应解析
 */
export const electronFetchAdapter: FetchResponse = async (
  url: string, // 接口路径(如 "/api/user/list")
  request: RequestInit // Alova 传入的请求数据
): Promise<ElectronResponse> => {
  // 1. 格式化请求参数(对齐 fetch API 格式,主进程可直接使用)
  const fetchParams = {
    method: request.method.toUpperCase(), // GET/POST/PUT/DELETE
    url,
    headers: {
      "Content-Type": "application/json; charset=UTF-8", // 默认 JSON 格式
      ...request.headers // 覆盖用户自定义请求头
    },
    // 处理请求体:GET/HEAD 无 body,其他方法序列化数据
    body: ["GET", "HEAD"].includes(request.method)
      ? undefined
      : JSON.stringify(request.body)
  };

  let downloadHandler: ProgressUpdater = () => {},
    uploadHandler: ProgressUpdater = () => {};

  // 2. IPC 转发给主进程,等待 主进程 响应
  const mainProcessResponse = ipcRenderer.invoke(url, fetchParams);

  // 3. 转换为主进程响应为 Alova 可识别的格式
  return {
    response: () => mainProcessResponse,
    headers: () => mainProcessResponse.then(res => res.headers),
    onDownload: handler => {
      downloadHandler = handler;
    },
    onUpload: handler => {
      uploadHandler = handler;
    }
  };
};

export default electronFetchAdapter;

不知道我的这个想法是否可以实现?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions