84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
我正在使用KeystoneJS框架提供的文档创建一个应用程序。所以,在我的应用程序中有两个表,一个是用户,另一个是帖子。所以,我想知道,当我通过登录到管理区创建一个帖子时,有一个带有外键列的字段,而且该字段为空,以填充来自用户表的外键值。所以,当我使用KeystoneJS中登录用户的id创建一个新帖子时,我希望系统自动将外键值添加到作者中。
所以,我到处寻找解决方案,但未能找到合适的解决方案。
如果有人对此有任何想法,请回答这个问题,将不胜感激。
谢谢
你有没有看过受控博客示例?
它有类似于你的项目的列表:Posts和Users,可以是Contributors或Moderators。在你的情况下,贡献者/管理员的区别并不重要,你会对Post列表上的钩子感兴趣,特别是resolveInput.create钩子,它看起来像这样:
Posts
Users
Contributors
Moderators
Post
resolveInput.create
hooks: { resolveInput: { create: ({ context, resolvedData }) => { resolvedData.createdAt = new Date(); if (context.session?.contributor) { return { ...resolvedData, createdBy: { connect: { id: context.session?.contributor?.id, }, }, }; } return resolvedData; }, }, // 其他钩子... },
根据文档:
所以这是我们在保存之前更改值的机会,包括填充或强制值,比如你的Post.author字段。
Post.author
resolveInput获取context对象,其中包括对session对象的引用。该对象的内容由你的会话存储函数决定,但通常包含有关当前用户的信息。在这个示例中,如果登录的用户是贡献者,我们从context.session?.contributor?.id获取他们的贡献者ID,并将其保存到createdBy字段。同时,createdAt字段也设置为当前日期和时间。
resolveInput
context
session
context.session?.contributor?.id
createdBy
createdAt
请注意,由于此钩子在列表级别配置,因此应返回整个项目的数据(基本上是resolvedData对象和钩子想要进行的任何其他更改)。另一种方法是在字段级别添加resolvedData函数,但这样我们就需要两个单独的函数 - 一个用于createdAt,另一个用于createdBy - 每个函数都会返回一个单一的值。有关此区别的更多信息,请参阅钩子指南。
resolvedData
此外,重要的是不要将钩子与访问控制混淆 - 即是否应允许贡献者首先创建帖子。在这个示例中,访问控制是单独配置的,在列表的access配置中。
access
最后一点 - 在撰写本文时,钩子API文档涵盖了resolveInput钩子(在列表和字段级别),但没有将其分解为不同的操作(即resolveInput.create和resolveInput.update)。这只是一种最近的语法改进,它并不改变钩子的使用方式。如果只使用文档中的API,上面的代码可以写成:
resolveInput.update
hooks: { resolveInput: ({ operation, context, resolvedData }) => { // 仅对创建操作运行(忽略更新) if (operation !== 'create') return resolvedData; resolvedData.createdAt = new Date(); if (context.session?.contributor) { return { ...resolvedData, createdBy: { connect: { id: context.session?.contributor?.id, }, }, }; } return resolvedData; }, // 其他钩子... },
你有没有看过受控博客示例?
它有类似于你的项目的列表:
Posts
和Users
,可以是Contributors
或Moderators
。在你的情况下,贡献者/管理员的区别并不重要,你会对Post
列表上的钩子感兴趣,特别是resolveInput.create
钩子,它看起来像这样:根据文档:
所以这是我们在保存之前更改值的机会,包括填充或强制值,比如你的
Post.author
字段。resolveInput
获取context
对象,其中包括对session
对象的引用。该对象的内容由你的会话存储函数决定,但通常包含有关当前用户的信息。在这个示例中,如果登录的用户是贡献者,我们从context.session?.contributor?.id
获取他们的贡献者ID,并将其保存到createdBy
字段。同时,createdAt
字段也设置为当前日期和时间。请注意,由于此钩子在列表级别配置,因此应返回整个项目的数据(基本上是
resolvedData
对象和钩子想要进行的任何其他更改)。另一种方法是在字段级别添加resolvedData
函数,但这样我们就需要两个单独的函数 - 一个用于createdAt
,另一个用于createdBy
- 每个函数都会返回一个单一的值。有关此区别的更多信息,请参阅钩子指南。此外,重要的是不要将钩子与访问控制混淆 - 即是否应允许贡献者首先创建帖子。在这个示例中,访问控制是单独配置的,在列表的
access
配置中。最后一点 - 在撰写本文时,钩子API文档涵盖了
resolveInput
钩子(在列表和字段级别),但没有将其分解为不同的操作(即resolveInput.create
和resolveInput.update
)。这只是一种最近的语法改进,它并不改变钩子的使用方式。如果只使用文档中的API,上面的代码可以写成: