npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@neteasecloudmusicapienhanced/api-framework

v1.2.1

Published

A generic API reverse proxy framework for reverse engineers to DIY platform API reverse proxies

Readme

api-framework

通用 API 反向代理框架,为逆向工程师打造的 API 反代脚手架,基于 api-enhanced 项目架构提取。

安装

npm install @neteasecloudmusicapienhanced/api-framework

全局安装:

npm install -g @neteasecloudmusicapienhanced/api-framework

快速开始

# 交互式初始化向导(推荐)
npx @neteasecloudmusicapienhanced/api-framework init

# 或直接指定项目名(仍会交互询问包管理器)
npx @neteasecloudmusicapienhanced/api-framework init my-project

# 或完全非交互式(适用于脚本)
npx @neteasecloudmusicapienhanced/api-framework init my-project --pm pnpm

# 进入目录
cd my-project

# 启动开发模式(nodemon 热重载)
npm run dev

CLI 命令

| 命令 | 说明 | |------|------| | init [name] | 交互式初始化向导(可选项目名,支持 --pm 指定包管理器) | | dev | 开发模式(运行 app.js) | | start | 生产模式启动 | | generate module <name> | 生成模块模板 | | generate plugin <name> | 生成插件模板 |

提示: init 命令支持三种模式:

  • npx ... init — 纯交互式 TUI 向导,依次询问项目名和包管理器
  • npx ... init my-project — 半交互式,名字预填,只问包管理器
  • npx ... init my-project --pm pnpm — 非交互式,适合 CI/脚本

模块编写

函数式(推荐)

文件名 module/user_info.js 自动映射到路由 /user/info,下划线 _ 转为斜杠 /

module.exports = async (ctx, core) => {
  const { query, body, cookies } = ctx
  const { request, logger } = core

  const result = await request('/target/api', {
    id: query.id,
  }, {
    method: 'POST',
    cookie: cookies,
  })

  return {
    status: result.status,
    body: result.body,
    cookie: result.cookie,
  }
}

对象式

需要自定义路由或 HTTP 方法时使用:

module.exports = {
  route: '/api/v1/custom',
  method: 'get',
  handler: async (ctx, core) => {
    return {
      status: 200,
      body: { code: 200, data: 'ok' },
    }
  },
}

ctx 和 core

ctx(请求上下文)

| 属性 | 类型 | 说明 | |------|------|------| | query | object | 合并的请求参数(query + body + files) | | body | object | 请求体 | | cookies | object | 解析后的 Cookie 对象 | | files | object | 上传的文件 | | headers | object | 请求头 | | method | string | HTTP 方法 | | path | string | 请求路径 | | ip | string | 客户端 IP |

core(核心工具)

| 属性 | 类型 | 说明 | |------|------|------| | request | function | HTTP 请求引擎(axios 封装) | | logger | object | 分级日志工具 | | config | object | 当前配置 | | cache | object | 内存缓存实例 | | req | object | Express req 对象 | | res | object | Express res 对象 |

插件编写

插件支持 5 个生命周期钩子,按执行顺序排列:

module.exports = {
  name: 'my-plugin',

  // 服务器启动前,可修改 app 和 config
  beforeServer: async ({ app, config }) => {},

  // 所有路由注册完成后
  afterRoutes: async ({ app, config }) => {},

  // 每次请求处理前
  beforeRequest: async ({ req, res, module }) => {},

  // 每次请求处理后
  afterRequest: async ({ req, res, module, result }) => {},

  // 请求出错时
  onError: async ({ req, res, module, error }) => {},
}

配置

通过 .env 文件或环境变量配置:

PORT=3000
HOST=0.0.0.0
LOG_LEVEL=info
ENABLE_CACHE=true
CACHE_TTL=120
CORS_ALLOW_ORIGIN=*
MAX_UPLOAD_SIZE=100
REQUEST_TIMEOUT=30000

也可通过项目根目录的 config.js 覆盖框架默认配置:

module.exports = {
  port: 3000,
  host: '0.0.0.0',
}

作为 npm 库使用

const api = require('@neteasecloudmusicapienhanced/api-framework')

// 启动服务器
const app = await api.server.createApp()
await api.server.startServer(app, 3000, '0.0.0.0')

// 直接调用模块方法
const result = await api.user_info({ id: '123' })

项目结构

my-project/
├── config.js        # 配置文件
├── .env             # 环境变量
├── module/          # API 模块
│   ├── example.js
│   └── ...
├── plugins/         # 插件
│   └── ...
├── util/            # 工具函数
│   ├── index.js
│   └── encrypt/     # 加密示例
│       ├── aes.js
│       ├── rsa.js
│       └── md5.js
└── public/          # 静态文件

与 api-enhanced 的关系

api-framework 是 api-enhanced 架构的通用化提取。区别在于:

  • api-enhanced 专用于网易云音乐 API,内置平台加密
  • api-framework 为通用框架,不捆绑任何平台加密,加密由用户在 util/encrypt/ 中自行实现

License

MIT