Keystone 6无法提供图片与文件访问:路由匹配失败且前端无法获取资源
Keystone 6无法提供图片与文件访问:路由匹配失败且前端无法获取资源
我来帮你排查这个头疼的问题!你遇到的情况在Keystone 6使用本地存储时挺常见的,核心问题大概率是baseUrl配置、路由映射或者静态资源权限出了岔子,咱们一步步拆解:
先排查最容易踩的坑:baseUrl的正确性
你配置里的generateUrl依赖baseUrl生成访问链接,这一步要是错了,前端拿到的URL根本指向不了正确位置:
- 首先确认
baseUrl是Keystone服务的完整根路径,比如本地开发时应该是http://localhost:3000(假设你的Keystone跑在3000端口),生产环境要换成你的域名,比如https://your-app.com。 - 注意别加末尾的斜杠!比如写成
http://localhost:3000/的话,生成的链接会变成//files/xxx,直接无效。
检查存储目录与路由配置的匹配度
Keystone不会自动创建存储目录,也不会默认开放public目录的访问权限,这两点很容易被忽略:
- 先手动在项目根目录创建
public/files和public/images文件夹,并且确保Keystone有写入权限(比如本地开发时给目录加755权限)。上传文件后,去这些目录里确认文件确实存在,要是找不到,说明storagePath配置错了或者权限不足。 - 你的
serverRoute配置是path: '/files'和path: '/images',这意味着Keystone会帮你注册这两个路由来提供文件访问。比如图片的访问链接应该是baseUrl/images/xxx.jpg,而不是baseUrl/public/images/xxx.jpg——千万别直接访问public目录,Keystone没开放这个静态资源路由。
用GraphQL调试确认返回的URL是否正确
这是最直接的验证方式:
- 打开Keystone的GraphQL Playground(一般是
baseUrl/api/graphql)。 - 执行查询获取文件/图片字段的信息:
query { # 替换成你的列表名称,比如users/posts等 users { avatar { url path } someFile { url path } } }
- 复制返回的
url到浏览器里直接访问:- 如果返回404:要么是
url格式错误(比如少了斜杠、域名不对),要么是Keystone的serverRoute没生效,可能和你自定义的路由冲突了。 - 如果能正常打开:那问题出在前端的Apollo请求或者渲染逻辑上,比如没正确读取
url字段。
- 如果返回404:要么是
最后检查开发/生产环境的差异
如果是生产环境部署:
- 要确保
public/files和public/images目录被正确打包进部署包(比如用Docker的话要复制或者挂载目录)。 - 生产环境的
baseUrl一定要换成你的真实域名,不能用localhost。
给你一个验证过的正确配置参考,你可以对照调整:
const baseUrl = process.env.NODE_ENV === 'production' ? 'https://your-production-domain.com' : 'http://localhost:3000'; export default config({ // 其他配置... storage: { my_local_files: { kind: 'local', type: 'file', generateUrl: (path) => `${baseUrl}/files${path}`, serverRoute: { path: '/files', }, storagePath: 'public/files', }, my_local_images: { kind: 'local', type: 'image', generateUrl: (path) => `${baseUrl}/images${path}`, serverRoute: { path: '/images', }, storagePath: 'public/images', }, }, // 其他配置... });
按照上面的步骤排查,应该能快速定位到问题所在!
备注:内容来源于stack exchange,提问作者ultrapanam
相关产品推荐
相关产品推荐

