我正在使用KeystoneJS框架提供的文檔創(chuàng)建一個應用程序。所以,在我的應用程序中有兩個表,一個是用戶,另一個是帖子。所以,我想知道,當我通過登錄到管理區(qū)創(chuàng)建一個帖子時,有一個帶有外鍵列的字段,而且該字段為空,以填充來自用戶表的外鍵值。所以,當我使用KeystoneJS中登錄用戶的id創(chuàng)建一個新帖子時,我希望系統(tǒng)自動將外鍵值添加到作者中。
所以,我到處尋找解決方案,但未能找到合適的解決方案。
如果有人對此有任何想法,請回答這個問題,將不勝感激。
謝謝
你有沒有看過受控博客示例?
它有類似于你的項目的列表:Posts
和Users
,可以是Contributors
或Moderators
。在你的情況下,貢獻者/管理員的區(qū)別并不重要,你會對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; }, }, // 其他鉤子... },
根據(jù)文檔:
所以這是我們在保存之前更改值的機會,包括填充或強制值,比如你的Post.author
字段。
resolveInput
獲取context
對象,其中包括對session
對象的引用。該對象的內(nèi)容由你的會話存儲函數(shù)決定,但通常包含有關當前用戶的信息。在這個示例中,如果登錄的用戶是貢獻者,我們從context.session?.contributor?.id
獲取他們的貢獻者ID,并將其保存到createdBy
字段。同時,createdAt
字段也設置為當前日期和時間。
請注意,由于此鉤子在列表級別配置,因此應返回整個項目的數(shù)據(jù)(基本上是resolvedData
對象和鉤子想要進行的任何其他更改)。另一種方法是在字段級別添加resolvedData
函數(shù),但這樣我們就需要兩個單獨的函數(shù) - 一個用于createdAt
,另一個用于createdBy
- 每個函數(shù)都會返回一個單一的值。有關此區(qū)別的更多信息,請參閱鉤子指南。
此外,重要的是不要將鉤子與訪問控制混淆 - 即是否應允許貢獻者首先創(chuàng)建帖子。在這個示例中,訪問控制是單獨配置的,在列表的access
配置中。
最后一點 - 在撰寫本文時,鉤子API文檔涵蓋了resolveInput
鉤子(在列表和字段級別),但沒有將其分解為不同的操作(即resolveInput.create
和resolveInput.update
)。這只是一種最近的語法改進,它并不改變鉤子的使用方式。如果只使用文檔中的API,上面的代碼可以寫成:
hooks: { resolveInput: ({ operation, context, resolvedData }) => { // 僅對創(chuàng)建操作運行(忽略更新) if (operation !== 'create') return resolvedData; resolvedData.createdAt = new Date(); if (context.session?.contributor) { return { ...resolvedData, createdBy: { connect: { id: context.session?.contributor?.id, }, }, }; } return resolvedData; }, // 其他鉤子... },