除本站自媒体官号以外,本文的内容禁止任一组织、个人、账号或平台,以任何形式转载到 RainyDesign.cn 站外。
任何个人或组织进行非法转载的,本站工作人员可对其追究法律责任。
具体信息详见 条例与条款 。
Strapi 指南
一、前言
1.1 文档背景
本人有随手记录知识点的习惯,比如在遇见一些问题的时候顺手记录错误与解决方案等等。想想存着也是存着,提供课程之余也顺便发出来分享给宝子们;而且课程指南由于具备实效性,编辑起来非常麻烦,但是大体流程在后续版本更新中变更也不大,所以干脆放在这里统一管理更新后适用的知识点。
收藏文章请按下键盘上的Ctrl / Command + D加入书签栏。
本文档的完善程度较低,于未来的一段时间内仍有较大改动,敬请期待。
二、知识点
2.1 页面简介
| 页面名称 | 英文 | 功能与说明 |
|---|---|---|
| 主页 | Home | 欢迎、指南、事项、最后编辑、数据指标等 |
| 内容管理器 | Content Manager | 管理创建的各项数据结构中的内容 |
| 媒体库 | Media Library | 存储静态内容,它们都会被存放到项目下的 /public/uploads 目录中 |
| 内容类型构建器 | Content-Type Builder | 管理数据结构,仅在开发模式下(yarn run develop)可用,用于管理数据结构与接口 |
| 部署 | Deploy | Strapi 提供了官方付费托管方案,不过我们也可以用 CLI 自行部署,具体下述 |
| 插件广场 | Marketplace | Strapi 官方社区有很多适配版本的插件,可在这里查阅并安装 |
| 设置 | Settings | 管理各项设置 |
2.2 数据类型
| 类型 | 取值 | 高级设置 | 提示 |
|---|---|---|---|
| Text | 任意文字 | - | - |
| Boolean | 布尔值 | - | - |
| Rich text (Blocks) | 基于 JSON 输出的富文本块 | - | - |
| JSON | JSON | - | - |
| Number | 浮点,整数 | - | - |
| - | - | ||
| Date | 日期 | - | - |
| Password | 密码 | - | - |
| Media | 图片,视频,音频,文件 | - | - |
| Enumeration | 列表 | - | - |
| Relation | 关联一项数据 | - | - |
| UID | 专有识别内容 | - | - |
| Rich text (Markdown) | 基于 Markdown 输出的富文本块 | - | - |
| Component | 组件 | - | - | | ||
| Dynamic Zone | 选择一组可自由调用的选项,供页面弹性搭配 | - | - | |
2.3 常用过滤操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
$eq | 等于(默认) | filters[title][$eq]=Hello |
$ne | 不等于 | filters[title][$ne]=Hello |
$lt | 小于 | filters[id][$lt]=10 |
$lte | 小于等于 | filters[id][$lte]=10 |
$gt | 大于 | filters[id][$gt]=5 |
$gte | 大于等于 | filters[id][$gte]=5 |
$in | 包含在数组中 | filters[category][name][$in][0]=tech&filters[category][name][$in][1]=news |
$notIn | 不包含 | filters[category][name][$notIn][0]=draft |
$contains | 包含子串 | filters[title][$contains]=Next |
$notContains | 不包含子串 | filters[title][$notContains]=test |
$startsWith | 以...开始 | filters[slug][$startsWith]=guide |
$endsWith | 以...结束 | filters[slug][$endsWith]=tutorial |
$null | 为空 | filters[publishedAt][$null]=true |
$notNull | 不为空 | filters[publishedAt][$notNull]=true |
2.4 分页参数详解
| 参数 | 描述 | 示例 |
|---|---|---|
pagination[page] | 页码(从1开始) | pagination[page]=1 |
pagination[pageSize] | 每页条数 | pagination[pageSize]=10 |
pagination[start] | 起始位置 | pagination[start]=0 |
pagination[limit] | 限制条数 | pagination[limit]=10 |
三、故障排查
3.1 常见错误
启动相关错误:
-
⠸ Loading Strapi[ERROR] There seems to be an unexpected error, try again with --debug for more information- 解决方案: 使用
yarn develop --debug或npm run develop -- --debug获取详细错误信息 - 常见原因: 数据库连接失败、端口被占用、依赖包版本冲突
- 解决方案: 使用
-
Error: listen EADDRINUSE: address already in use :::1337- 解决方案: 端口被占用,使用
lsof -i :1337查找占用进程,或修改.env中的PORT配置
- 解决方案: 端口被占用,使用
-
Module not found: Can't resolve '@strapi/design-system'- 解决方案: 删除
node_modules和package-lock.json,重新安装依赖
代码已复制!
rm -rf node_modules package-lock.json npm install - 解决方案: 删除
数据库相关错误:
-
ER_ACCESS_DENIED_ERROR: Access denied for user- 解决方案: 检查
.env中的数据库用户名密码,确保用户有足够权限 - 权限检查: 用户需要
CREATE, ALTER, DROP, SELECT, INSERT, UPDATE, DELETE权限
- 解决方案: 检查
-
Database connection error: Unknown database- 解决方案: 手动创建数据库,或确保 Strapi 用户有创建数据库的权限
代码已复制!
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol- 解决方案: MySQL 8.0 认证问题,需要修改用户认证方式
代码已复制!
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
3.2 常见问题
-
Q: 我要修改 Strapi 连接的数据库,以及其用户名与密码,可我不知道它在哪里
- 在 Strapi 项目的根目录下有一个
.env文件,除了配置连接数据库以及账号密码以外,服务器的 ip 与端口,以及数据库的客户端类型、ip、端口与开关 SSL 连接都是在这里配置的。
- 在 Strapi 项目的根目录下有一个
-
Q: 如何修改 Strapi 的数据库连接配置?
- A: 编辑项目根目录下的
.env文件,修改以下配置:
代码已复制!
DATABASE_CLIENT=mysql DATABASE_HOST=127.0.0.1 DATABASE_PORT=3306 DATABASE_NAME=your_database_name DATABASE_USERNAME=your_username DATABASE_PASSWORD=your_password DATABASE_SSL=false - A: 编辑项目根目录下的
-
Q: 如何更改 Strapi 的默认端口?
- A: 在
.env文件中添加或修改:
代码已复制!
PORT=1338 HOST=0.0.0.0 - A: 在
-
Q: 忘记了管理员密码怎么办?
- A: 可以通过数据库直接重置,或使用以下命令:
代码已复制!
yarn run strapi admin:reset-user-password --email=admin@example.com # 或使用 npm npm run strapi admin:reset-user-password --email=admin@example.com
3.3 API 报错
| 错误编码 | 错误名称 | 错误信息 | 解决方案 & 说明 |
|---|---|---|---|
| 400 | ValidationError | Invalid key [Key name] | 检查 API 请求中的字段名是否正确,确认数据结构定义 |
| 400 | ValidationError | This attribute must be unique | 唯一字段重复,检查 UID 或设置为唯一的字段值 |
| 400 | ApplicationError | Relation not found | 关联数据不存在,检查关联的 ID 是否有效 |
| 401 | UnauthorizedError | Missing or invalid credentials | API Token 缺失或无效,检查请求头中的 Authorization |
| 403 | ForbiddenError | Forbidden | 权限不足,在 Settings → Users & Permissions Plugin → Roles 中检查相应权限 |
| 403 | PolicyError | Policy failed | 自定义策略阻止了请求,检查相关策略配置 |
| 404 | NotFoundError | Not Found | 数据不存在或未发布,检查:1. ID 是否正确 2. 数据是否已发布 3. 权限设置 |
| 413 | PayloadTooLargeError | Request entity too large | 上传文件过大,检查 body-parser 配置和服务器限制 |
| 429 | TooManyRequestsError | Too many requests | 请求频率过高,实施请求限制或增加延迟 |
| 500 | ApplicationError | An error occurred during route generation | 路由生成错误,通常是数据结构配置问题 |
| 500 | DatabaseError | Database connection failed | 数据库连接失败,检查数据库服务和连接配置 |
3.4 性能和优化问题
常见性能问题:
-
Q: API 响应慢?
- A: 检查以下几点:
- 使用
populate时避免过深的嵌套 - 使用
fields参数只获取需要的字段 - 合理使用分页参数
- 为常用查询字段添加数据库索引
- 使用
- A: 检查以下几点:
-
Q: 内存占用过高?
- A:
- 检查是否有内存泄漏
- 优化图片上传大小
- 使用 CDN 存储媒体文件
- 定期清理日志文件
- A:
最佳实践建议:
代码已复制!
// ❌ 不推荐:获取所有数据和关联 const badQuery = '/api/articles?populate=*'; // ✅ 推荐:只获取需要的字段和关联 const goodQuery = '/api/articles?fields[0]=title&fields[1]=slug&populate[author][fields][0]=name&pagination[pageSize]=10';
(未完待续...)

