[js] 思源内核也可以扩展了 / 代理实现后端级安全的发布服务

功能介绍

  1. 扩充内核 api,可自定义 api 服务。
  2. 代理转发,可转发 6806 或 6808 等端口及远程服务等。
  3. 运行于 Electron render 进程,因此同时具备获取前端页面和对象的能力,又具有提供 api 服务的能力,还可以直接调用思源内核 api。
  4. 支持简单认证。
  5. 支持简单路由和中间件。
  6. 不依赖 Express/Koa 等框架,所有逻辑均为原生 Node.js 实现。
  7. 无需安装 Node 环境,直接运行与 js 代码片段中即可,使用门槛低。
  8. 看似很强大,其实很鸡肋,因为懂开发的不需要,不懂开发的也不会用trollface

使用场景

  1. 需要第三方调用自定义 api 的时候。虽然思源有 websocket,但有些第三方工具可能支持不好,比如 quicker。通过 http 调用的方式更容易扩展。
  2. 发布服务,隐藏自己想要过滤的 api,实现后端级的安全保障(但需要自己写代码)。

安装

  1. 下载文件 my-api-server-v5.zip,解压后放于思源工作空间/data/public/文件夹中即可。

  2. 把下面的代码放到思源 js 代码片段中即可。

    {
       let serverPort = 6809 // 可选,默认6809端口,也可以在config中配置
       import('/public/my-api-server/server.js')
    }
    

    想监控多个端口和服务可以放入到 2 个代码片段中或隔离作用域后执行 2 次。

  3. 重启思源。

  4. 测试,可通过访问 http://127.0.0.1:6809/productshttp://127.0.0.1:6809/ 查看,前者是自定义 api,后者是代理 6806 端口。

  5. v5 新增支持/?action=xxxx 路由,比如可以通过 http://127.0.0.1:6809/productshttp://127.0.0.1:6809/?action=products 访问。

目录结构

项目根目录:/data/public/my-api-server/

  • server.js:服务主入口,负责请求分发和代理转发。
  • router.js:路由表配置,维护 method+path 到 handler 的映射。
  • service/:具体业务处理模块,按资源拆分(如 user.js, product.js)。
  • proxyService/:代理转发处理模块,根据 routeMap 分发处理函数。
  • common.js:通用工具函数(如日志、请求体解析、标准响应)。
  • config.js:端口等基础配置。
  • .github/copilot-instructions.md:开发协作与代码规范说明。
  • README.md:中文文档说明(本文件)。

使用说明

  1. 启动服务
    在思源笔记 js 代码片段中新增以下代码即可:

    {
       let serverPort = 6809 // 可选,默认6809端口,也可以在config中配置
       import('/public/my-api-server/server.js')
    }
    

    当运行于 Electron 环境中时,确保 window.siyuan 对象可用。
    也可命令行运行:

    node server.js --port=6809
    

    注意:当运行于命令行时,失去获取前端的能力。

  2. 扩展 API

    • service/ 目录新建业务处理文件(如 foo.js),导出处理函数。
    • router.js 添加路由映射,关联到对应 handler。
  3. 代理转发

    • 修改 config.js 中的 FORWARD_HOSTFORWARD_PORT,设置代理目标。
    • 可在 proxyService/proxyApi.js 中自定义过滤或修改的 api 和处理函数。
  4. 调用前端对象和思源自带 API

    • 可直接调用前端对象和思源笔记原生 API,实现数据交互。

保活问题

由于 render 进程执行,长期停留后台可能停止服务(暂未发现有失活问题)。

如果发生,可能的解决办法有:

  1. 保持与主进程通信(比如 ws 通信,如果需要的话)
  2. node 命令执行(将失去获取前端的能力)

调试

由于直接在思源渲染进程执行,因此可以通过思源的开发者工具直接调试或打印。

注意打印结果在思源控制台,不是浏览器控制,因为这是服务器结果打印。

主服务器入口在 public 文件夹下

image.png

动态加载的代码在无网域

image.png

然后可以把调试结果打印到控制台或通过源码断点调试就好了。

手把手教程

新手如何使用?

注意事项

  1. 支持运行于 pc 端的 Electron 环境,也支持运行与命令行下。但运行于命令行下时,失去获取前端的能力。
  2. 认证仅对 token 进行简单对比,如果有需要,请自行扩展认证方式。
  3. 本项目仅仅是实验或 demo,并未严格测试,请勿用于生产环境。

免责声明

本项目仅供学习与个人扩展使用,所有功能均依赖于思源笔记环境。请勿用于非法用途和生产环境,因使用本项目造成的任何后果,开发者不承担任何责任。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28446 引用 • 119783 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    285 引用 • 1986 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • wilsons

    怎么用这要看你的需求,想要什么功能

    我这里简单介绍下大概使用方法

    主要有两大块功能

    1 自定义 api

    2 代理服务,比如代理发布服务

    先说第 1 点,比如,你可以在 public/my-api-server/service 下新建文件 demo.js

    然后输入以下示例代码:

    // service/demo.js
    module.exports = {
      demo: (req, res) => {
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify({ message: "This is a demo response" }));
      }
    };
    

    然后在 public/my-api-server/router.js 中添加如下代码:

    const demoService = require(path.join(__dirname, 'service', 'demo.js'));
    

    // 路由配置 👇
    const routes = {
      // 省略其他路由
      'GET /demo': { handler: demoService.demo, middlewares: [] },
    };
    

    然后刷新思源,然后在浏览器输入 http://127.0.0.1:6809/demo 即可访问自定义的 api 了。

    再说第 2 点,你可以打开 public/my-api-server/config.js 先配置代理的地址和端口,比如,把 proxyPort 设置为 6808,并且你的发布服务也是 6808 这个端口的话,就代理了发布服务。

    你可以打开 public/my-api-server/proxyService/proxyApi.js 查看示例,比如文件中的 injectExtra 函数就是过滤并修改 /api/system/getConf 接口的。

    大概流程是这样的,当你访问 http://127.0.0.1:6809/api/system/getConf 时,实际访问的是 http://127.0.0.1:6808/api/system/getConf,且当 6809 服务拿到 6808 的端口后会根据请求 URL 地址判断是否目标 api,比如是否/api/system/getConf 接口,如果是,则根据 routeMap 定义的路由规则,调用 injectExtra 函数来处理接口返回结果,这个示例里,是把请求结果加一个字段 extra,json.data.extra = 'modified by proxy';

    那么,你需要做什么?

    1 如果想自定义接口,按第一点的说明写接口即可

    2 如果你想过滤发布服务的接口,按第二点的说明写相关过滤函数即可

    如果不熟悉编程怎么办?

    建议让 AI 帮忙写,可以用在线 AI 或相关 IDE 等。

    比如 cursor,vscode 的 copilot,如果想免费可以使用国内同类 IDE 或插件,比如通义灵码等。

    也可以使用第三方插件 + 自定义大模型服务商,主要是免费或更便宜的价格(推荐 @Achuan-2 大佬推荐的 OAI Compatible Provider for Copilot 插件 帖子介绍)。

    如果新手建议用 Claude 和 ChatGPT,生成的代码更简洁易懂。国内如果不好访问也可以用云梯或第三方大模型代理商,比如,V-API 等。

    3 操作
    wilsons 在 2025-09-24 19:07:58 更新了该回帖
    wilsons 在 2025-09-24 19:06:13 更新了该回帖
    wilsons 在 2025-09-23 17:00:20 更新了该回帖
  • 其他回帖
  • sunrain

    请教下大佬,安装了,然后呢?怎么用。

    1 回复
  • wilsons

    最新版支持同时运行于命令行或代码片段中的能力。

    但,当运行于命令行下时,失去获取前端的能力。

  • sunrain

    感谢 🙏 佬耐心细致讲解,悟了。

  • 查看全部回帖
wilsons
正式入驻知乎了,以后新贴主要在这里。 欢迎大家订阅关注! 你的关注对我是莫大鼓励,也能让我持续产出优质内容,我们一起成长 🙏 点这里立即关注:https://www.zhihu.com/people/wilsonses