自動將已登入使用者的ID加入到KeystoneJS外鍵欄位中
P粉239164234
P粉239164234 2023-09-14 12:23:19
0
1
668

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

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

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

謝謝

P粉239164234
P粉239164234

全部回覆(1)
P粉949190972

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

它有類似你的專案的清單: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;
  },
  // 其他钩子...
},
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板