Heim  >  Fragen und Antworten  >  Hauptteil

Fügen Sie die ID des angemeldeten Benutzers automatisch zum KeystoneJS-Fremdschlüsselfeld hinzu

Ich erstelle eine Anwendung unter Verwendung der vom KeystoneJS-Framework bereitgestellten Dokumentation. In meiner App habe ich also zwei Tabellen, eine ist Benutzer und die andere ist Beiträge. Ich frage mich also: Wenn ich einen Beitrag erstelle, indem ich mich im Admin-Bereich anmelde, gibt es ein Feld mit einer Fremdschlüsselspalte, und dieses Feld ist leer, um mit dem Fremdschlüsselwert aus der Benutzertabelle gefüllt zu werden. Wenn ich also einen neuen Beitrag mit der ID des angemeldeten Benutzers in KeystoneJS erstelle, möchte ich, dass das System den Fremdschlüsselwert automatisch zum Autor hinzufügt.

Also habe ich überall nach einer Lösung gesucht, aber keine passende gefunden.

Wenn jemand eine Idee dazu hat, wäre er sehr dankbar, wenn er diese Frage beantworten könnte.

Danke

P粉239164234P粉239164234401 Tage vor631

Antworte allen(1)Ich werde antworten

  • 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;
      },
      // 其他钩子...
    },

    Antwort
    0
  • StornierenAntwort