首頁  >  問答  >  主體

自動將已登入使用者的ID加入到KeystoneJS外鍵欄位中

我正在使用KeystoneJS框架提供的文件建立一個應用程式。所以,在我的應用程式中有兩個表,一個是用戶,另一個是帖子。所以,我想知道,當我透過登入管理區創建一個帖子時,有一個帶有外鍵列的字段,而且該字段為空,以填充來自用戶表的外鍵值。所以,當我使用KeystoneJS中登入使用者的id建立一個新貼文時,我希望系統自動將外鍵值新增到作者

所以,我到處尋找解決方案,但未能找到合適的解決方案。

如果有人對此有任何想法,請回答這個問題,將不勝感激。

謝謝

P粉239164234P粉239164234401 天前634

全部回覆(1)我來回復

  • P粉949190972

    P粉9491909722023-09-15 10:10:38

    你有沒有看過受控部落格範例

    它有類似你的專案的清單:PostsUsers,可以是ContributorsModerators。在你的情況下,貢獻者/管理員的區別並不重要,你會對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.createresolveInput.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;
      },
      // 其他钩子...
    },

    回覆
    0
  • 取消回覆