typescript KeystoneJS 6 - graphQLSchemaExtension -无会话

p8h8hvxi  于 2022-11-26  发布在  TypeScript
关注(0)|答案(4)|浏览(140)

我遇到graphQLSchemaExtension问题
我的自定义突变没有活动的会话
下面的一个例子说明自定义变异的开始And my graphQLSchemaExtension声明And my Keystone.ts文件
在我的通用查询/突变上,我有一个会话。在我的前端也是如此
谢谢〈3

我试图改变keystone.ts上的安全选项,但没有任何变化检查谷歌,检查KeystoneJS github问题

f0ofjuux

f0ofjuux1#

我假设当你说“我的自定义变异上没有活动会话”时,你的意思是,在你的自定义变异解析器中,context参数的session属性是null
不确定是什么原因导致了您的情况。我创建了一个简单的Keystone应用程序,带有会话和自定义变体,但未能重现您描述的问题。在当前版本的Keystone中,自定义GraphQL语法与您使用的版本略有不同(docsexamples)。也有可能你看到的任何问题都已经被修复了。如果不知道你的package.json中的具体版本,很难知道。
我的例子只有一个可以验证身份的User列表和一个名为getRandom的变量,它返回一个随机浮点数。下面是keystone.ts

import { list, config, graphql } from '@keystone-6/core';
import { statelessSessions } from '@keystone-6/core/session';
import { allowAll } from '@keystone-6/core/access';
import { text, password } from '@keystone-6/core/fields';
import { createAuth } from '@keystone-6/auth';
import { Context } from '.keystone/types';

let sessionSecret = Math.random().toString(36).substring(2, 10).repeat(4);
let sessionMaxAge = 60 * 60 * 24 * 30;

const { withAuth } = createAuth({
  listKey: 'User',
  identityField: 'email',
  secretField: 'password',
  sessionData: 'name',
});

const lists = {
  User: list({
    access: allowAll,
    fields: {
      name: text({ validation: { isRequired: true } }),
      email: text({ isIndexed: 'unique', validation: { isRequired: true } }),
      password: password(),
    },
  }),
};

const extendGraphqlSchema = graphql.extend(base => ({
  mutation: {
    getRandom: graphql.field({
      type: graphql.Float,
      args: {},
      resolve(source, {}, context: Context) {
        console.log('Dumping session object:', context.session);
        return Math.random();
      },
    }),
  },
}));

export default withAuth(
  config({
    db: {
      provider: 'postgresql',
      url: process.env.DATABASE_URL || 'postgres://molomby@localhost/ks6-auth',
    },
    lists,
    session: statelessSessions({
      maxAge: sessionMaxAge,
      secret: sessionSecret,
    }),
    extendGraphqlSchema,
  })
);

我在Keystone主存储库的一个克隆中的examples目录外运行这个程序,因此包的版本是最新的,特别是:@keystone-6/auth@5.0.1@keystone-6/core@3.1.2中的至少一个。
数据库中手动植入了一个用户,因此我可以进行身份验证:

然后我启动应用程序,点击自定义突变:

mutation {
   getRandom
}

如果没有当前会话,则context.session为null,正如您所期望的:

Dumping session object: undefined

但是,如果我使用种子用户记录登录到Admin UI,然后从GraphQL Playground(当然是在sam浏览器中)中点击该变体,我的GraphQL解析器将转储您所期望的会话对象:

Dumping session object: {
  listKey: 'User',
  itemId: 'claro2yq40008lh6y5wpkh2s1',
  data: [Object: null prototype] { name: 'Molomby' }
}
pdkcd3nj

pdkcd3nj2#

感谢您的回复
context.session在自定义变异上为空
我不理解GraphQL扩展的新语法:

const extendGraphqlSchema = graphql.extend(base => ({
  mutation: {
    getRandom: graphql.field({
      type: graphql.Float,
      args: {},
      resolve(source, {}, context: Context) {
        console.log('Dumping session object:', context.session);
        return Math.random();
      },
    }),
  },
}));

type的作用是什么?
我的扩展:

"dependencies": {
    "@keystone-6/auth": "^4.0.0",
    "@keystone-6/core": "^2.1.0",
    "@keystone-6/fields-document": "^4.0.1",
    "@keystonejs/server-side-graphql-client": "^2.1.2",
    "@prisma/client": "^4.4.0",
    "@types/nodemailer": "^6.4.4",
    "dotenv": "^10.0.0",
    "graphql": "^15.8.0",
    "next": "12.2.4",
    "nodemailer": "^6.6.2",
    "stripe": "^8.161.0",
    "typescript": "^4.7.4"
  },

更好的解决方案是共享此存储库。这是一个开放源代码的学习项目

项目链接:https://github.com/thibault60000/keystone-6-backend
感谢您抽出宝贵时间:)

wgeznvg7

wgeznvg73#

使用文档中的“Graphql工具合并架构”(https://keyonejs.com/docs/guides/schema-extension#title)
“context.session”仍然未定义:/

export const extendGraphqlSchema = (schema: GraphQLSchema) =>
  mergeSchemas({
    schemas: [schema],
    typeDefs: `
      type Query {
        allGifts: [Gift]
      }
      type Mutation {
        confirmBooking(giftId: ID!): Boolean
      }
    `,
    resolvers: {
      Query: {
        // Testing
        allGifts: (root, { id, days }, context: Context) =>
          context.db.Gift.findMany(),
      },
      Mutation: {
        // To implement
        confirmBooking: (root, { giftId }, context: Context) => {
          console.log('CONTEXT', Object.keys(context));
          /*
            'db',           'query',
            'totalResults', 'prisma',
            'graphql',      'maxTotalResults',
            'sudo',         'exitSudo',
            'withSession',  'req',
            'session',      'startSession',
            'endSession',   'gqlNames',
            'images',       'files'
          */
          const session = context.session as Session;
          console.log('SESSION', session); // undefined
          return true;
        },
      },
    },
  });
mzsu5hc0

mzsu5hc04#

使用文档中的“Graphql工具合并架构”(https://keyonejs.com/docs/guides/schema-extension#title)
“context.session”仍然未定义:/

export const extendGraphqlSchema = (schema: GraphQLSchema) =>
  mergeSchemas({
    schemas: [schema],
    typeDefs: `
      type Query {
        allGifts: [Gift]
      }
      type Mutation {
        confirmBooking(giftId: ID!): Boolean
      }
    `,
    resolvers: {
      Query: {
        // Testing
        allGifts: (root, { id, days }, context: Context) =>
          context.db.Gift.findMany(),
      },
      Mutation: {
        // To implement
        confirmBooking: (root, { giftId }, context: Context) => {
          console.log('CONTEXT', Object.keys(context));
          /*
            'db',           'query',
            'totalResults', 'prisma',
            'graphql',      'maxTotalResults',
            'sudo',         'exitSudo',
            'withSession',  'req',
            'session',      'startSession',
            'endSession',   'gqlNames',
            'images',       'files'
          */
          const session = context.session as Session;
          console.log('SESSION', session); // undefined
          return true;
        },
      },
    },
  });

我尝试使用您的graphql.extend(base)语法,但日志dumping session object也未定义:)

export const extendGraphqlSchema = graphql.extend((base) => ({
  mutation: {
    confirmBooking: graphql.field({
      type: graphql.Float,
      args: {},
      // eslint-disable-next-line no-empty-pattern
      resolve(source, {}, context: Context) {
        console.log('Dumping session object:', context.session);
        return Math.random();
      },
    }),
  },
}));

相关问题