我正在使用KeystoneJS框架提供的文件建立一個應用程式。所以,在我的應用程式中有兩個表,一個是用戶,另一個是帖子。所以,我想知道,當我透過登入管理區創建一個帖子時,有一個帶有外鍵列的字段,而且該字段為空,以填充來自用戶表的外鍵值。所以,當我使用KeystoneJS中登入使用者的id建立一個新貼文時,我希望系統自動將外鍵值新增到作者。
所以,我到處尋找解決方案,但未能找到合適的解決方案。
如果有人對此有任何想法,請回答這個問題,將不勝感激。
謝謝
P粉9491909722023-09-15 10:10:38
你有沒有看過受控部落格範例?
它有類似你的專案的清單: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
欄位。
resolveInput
取得context
物件,其中包含對session
物件的參考。該物件的內容由你的會話儲存函數決定,但通常包含有關目前使用者的信息。在這個範例中,如果登入的使用者是貢獻者,我們從context.session?.contributor?.id
取得他們的貢獻者ID,並將其儲存到createdBy
字段。同時,createdAt
欄位也設定為目前日期和時間。
請注意,由於此鉤子在清單層級配置,因此應傳回整個專案的資料(基本上是resolvedData
物件和鉤子想要進行的任何其他變更)。另一種方法是在字段層級添加resolvedData
函數,但這樣我們就需要兩個單獨的函數- 一個用於createdAt
,另一個用於createdBy
- 每個函數都會傳回單一的值。有關此區別的更多信息,請參閱鉤子指南。
此外,重要的是不要將鉤子與存取控制混淆 - 即是否應允許貢獻者首先創建帖子。在這個範例中,存取控制是單獨配置的,在清單的access
設定中。
最後一點- 在撰寫本文時,鉤子API文檔涵蓋了resolveInput
鉤子(在列表和字段級別),但沒有將其分解為不同的操作(即resolveInput.create
和resolveInput.update
)。這只是一種最近的語法改進,它不會改變鉤子的使用方式。如果只使用文件中的API,上面的程式碼可以寫成:
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; }, // 其他钩子... },