如何在KeystoneJS中自动将登录用户ID填入post表的author外键字段
解决KeystoneJS创建Post时自动关联当前登录用户的问题
核心思路是利用KeystoneJS的hooks机制,在创建Post的环节自动从上下文获取当前登录用户ID,填充到author外键字段里,同时可以配合UI配置优化后台体验。
1. 配置Post列表的resolveInput钩子
在Post的schema定义中添加hooks.resolveInput,在创建操作触发时修改输入数据,关联当前用户:
const Post = list({ fields: { title: text({ validation: { isRequired: true } }), content: text(), author: relationship({ ref: 'User.posts', many: false }), }, hooks: { resolveInput: ({ operation, inputData, context }) => { // 仅在创建Post时执行自动填充 if (operation === 'create') { // 从session中获取当前登录用户ID const currentUserId = context.session.itemId; // 未登录时抛出错误(可选,根据业务需求调整) if (!currentUserId) { throw new Error('请先登录再创建文章'); } // 将当前用户ID关联到author字段 return { ...inputData, author: { connect: { id: currentUserId } }, }; } return inputData; }, }, });
2. 优化后台UI体验(可选)
为了避免用户在后台手动修改author字段,可以在author字段的配置中设置UI隐藏/只读:
author: relationship({ ref: 'User.posts', many: false, ui: { createView: { fieldMode: 'hidden' }, // 创建页面隐藏该字段 itemView: { fieldMode: 'read' }, // 详情页面设为只读 }, }),
3. 配置访问控制(可选)
确保只有登录用户才能创建Post,在Post的access配置中添加校验:
access: { create: ({ context }) => !!context.session.itemId, // 其他权限规则可根据需求补充,比如只允许作者编辑自己的Post update: ({ context, item }) => context.session.itemId === item.authorId, },
关键说明
context.session.itemId是Keystone默认存储当前登录用户ID的属性,前提是你的认证系统(比如Keystone内置认证、Auth.js)已经正确配置,session能正常获取用户信息。- 如果使用了自定义认证逻辑,需要调整获取用户ID的方式,比如从
context的自定义属性中读取。
内容的提问来源于stack exchange,提问作者mastercordy
相关产品推荐
相关产品推荐

