背景
需求:需要一个简单的图片上传接口,但不想为此专门搭建一个完整的后端项目。
之前接触过 Strapi,号称是“前端开发一大利器”,可以快速生成安全可靠的后端 API。趁此机会,深入学习并记录一下。
一句话总结 Strapi:一个开源的、可定制的 Headless CMS 框架,能让你通过图形化界面快速构建和管理 API。
官网:strapi.io
快速上手
初次接触可以跟随官方文档或相关教程做一个简单的 Demo,以了解其基本工作流程。 参考教程:新手入坑:strapi官网教程的简单示例学习
核心配置与概念
1. 数据库配置
Strapi 默认使用 SQLite 数据库,数据文件位于项目根目录下的 .tmp/data.db(默认被 .gitignore 忽略)。对于生产环境,通常需要更换为 MySQL, PostgreSQL 等数据库。
配置 MySQL 数据库:
- 在你的 MySQL 服务中创建一个新的数据库。
- 安装 Strapi 的 MySQL 数据库连接器:shell
npm install strapi-connector-bookshelf npm install mysql - 修改或创建
config/database.js文件:javascriptmodule.exports = ({ env }) => ({ connection: { client: 'mysql', connection: { host: env('DATABASE_HOST', '127.0.0.1'), port: env.int('DATABASE_PORT', 3306), database: env('DATABASE_NAME', 'strapi_db'), user: env('DATABASE_USERNAME', 'strapi_user'), password: env('DATABASE_PASSWORD', 'strapi_password'), ssl: env.bool('DATABASE_SSL', false), }, pool: { min: 0, max: 10, } }, });建议使用环境变量来管理敏感信息。
重启服务后,Strapi 会在指定的数据库中自动创建所需的表结构。原有的 SQLite 数据不会被迁移。

2. HTTP 请求
通过 Content-Type Builder 创建集合类型(Collection Type)后,Strapi 会自动生成一套完整的 RESTful API。你可以在 Roles & Permissions 设置中开放对应接口的公共访问权限。

对于关联(Relation)字段的更新(POST/PUT),只需传入关联项的 ID 即可。根据关系类型(一对一/一对多),字段值的类型为 number 或 number[]。
3. 路由配置
Strapi 的 API 路由定义在 api/{collection-type}/config/routes.json 文件中。你可以在这里自定义路由。

method: HTTP 请求方法 (GET, POST, PUT, DELETE 等)。path: 请求路径。handler: 处理该请求的 Controller 方法。例如,Post.find指向api/post/controllers/Post.js中的find方法。
关键实践:实现图片上传
一个常见的误区是尝试通过自定义一个集合类型来实现文件上传。但 Strapi 的 Content API 不支持 multipart/form-data 类型的请求,因此无法通过这种方式上传文件。
相关讨论见 GitHub Issue: POST multipart/form-data on generated API for file upload
正确方法:使用 Strapi 内置的 Upload 插件。
Upload 插件使用步骤
找到 Upload 插件的 API 端点: 该插件提供了一个开箱即用的
/upload端点用于处理文件上传。
开放上传权限: 在
Settings->Roles->Public中,找到Upload插件,并勾选upload权限。
发起 POST 请求:
- URL:
POST http://<your-strapi-url>/upload - Body: 使用
form-data格式。files: 选择你要上传的文件。这是一个必需的字段。- (可选)
ref: 关联模型的名称 (e.g.,restaurant)。 - (可选)
refId: 关联模型实例的 ID。 - (可选)
field: 关联模型中存储该文件的字段名。

- URL:
成功响应: 上传成功后,API 会返回一个包含文件信息的 JSON 数组。

默认情况下,上传的文件会存储在项目的 public/uploads 目录下,并通过 Strapi 服务对外提供访问。