问题描述
thx寻求帮助.
我在前端使用apollo客户端,在后端使用 graphql-nexus ,prisma2和graphql-yoga服务器.
Im using at the frontend the apollo-client and at the backend graphql-nexus,prisma2 and graphql-yoga server.
我想用@ paljs/plugins解决n + 1问题.
I want to solve the n + 1 problem with @paljs/plugins.
在前端,我有一个查询帖子,例如:
At the frontend I have a query posts like:
query posts{
posts {
id
favoritedBy(where: { id: { equals: $currentUserId } }) {
id
}
author {
id
avatar {
id
}
}
link {
id
}
games {
id
}
tags {
id
}
likes(where: { user: { id: { equals: $currentUserId } } }) {
id
}
}
}
帖子解析器:
import { PrismaSelect } from '@paljs/plugins'
export const posts = queryField('posts', {
type: 'Post',
list: true,
args: {
...
},
resolve: async (_parent, args, { prisma, request }, info) => {
const select = new PrismaSelect(info).value
let opArgs: FindManyPostArgs = {
take: 10,
orderBy: {
[args.orderBy]: 'desc',
},
...select
}
const post = await prisma.post.findMany(opArgs)
//The result I want to return with the "sub-models" like likes, author tags...
console.log(JSON.stringify(post, undefined, 2))
return post
},
})
我记录查询
const prisma = new PrismaClient({
log: ['query'],
})
我的问题:使用PrismaSelect,我有5个查询,而如果不检查前端的请求时间,则需要300-400ms.所以我做错了什么?我在 @ paljs/plugins 文档中看到了上下文中的选择.也许那是我的错误.如何在上下文中使用选择?
My Problem: With PrismaSelect, I have 5 queries more than without and If I check the request-time at the frontend I need 300-400ms longer with PrismaSelect. So what I'm doing wrong?I saw in the @paljs/plugins doc the select in the context. Maybe that is my mistake. How can I use the select in the context?
这里是我的上下文:
import { PrismaClient, PrismaClientOptions } from '@prisma/client'
import { PubSub } from 'graphql-yoga'
import { PrismaDelete, onDeleteArgs } from '@paljs/plugins'
class Prisma extends PrismaClient {
constructor(options?: PrismaClientOptions) {
super(options)
}
async onDelete(args: onDeleteArgs) {
const prismaDelete = new PrismaDelete(this)
await prismaDelete.onDelete(args)
}
}
export const prisma = new PrismaClient({
log: ['query'],
})
export const pubsub = new PubSub()
export interface Context {
prisma: PrismaClient
request: any
pubsub: PubSub
}
export function createContext(request: any): Context {
return { prisma, request, pubsub }
}
推荐答案
您需要知道要使用我的 PrismaSelect
插件,需要删除 nexus-prisma-plugin
打包并使用我的Pal.js CLI为nexus创建CRUD和ObjectType,并使用 @ paljs/nexus
插件添加 mackSchema
函数
You need to know that to use my PrismaSelect
plugin you need to remove the nexus-prisma-plugin
package and use my Pal.js CLI to create your CRUD and ObjectType for nexus and using @paljs/nexus
plugin to add in mackSchema
function
import { makeSchema } from '@nexus/schema';
import * as types from './graphql';
import { paljs } from '@paljs/nexus'; // import our plugin
export const schema = makeSchema({
types,
plugins: [paljs()],// here our plugin don't use nexus-prisma-plugin
outputs: {
schema: __dirname + '/generated/schema.graphql',
typegen: __dirname + '/generated/nexus.ts',
},
typegenAutoConfig: {
sources: [
{
source: require.resolve('./context'),
alias: 'Context',
},
],
contextType: 'Context.Context',
},
});
现在将此类型添加到您的 Context
Now add this type to your Context
export interface Context {
prisma: PrismaClient
request: any
pubsub: PubSub
select: any // here our select type
}
export function createContext(request: any): Context {
// our paljs plugin will add select object before resolver
return { prisma, request, pubsub, select: {} }
}
添加我们的插件后,您的查询将像这样记录
after you add our plugin your query will log like this
extendType({
type: 'Query',
definition(t) {
t.field('findOneUser', {
type: 'User',
nullable: true,
args: {
where: arg({
type: 'UserWhereUniqueInput',
nullable: false,
}),
},
resolve(_, { where }, { prisma, select }) {
// our plugin add select object into context for you
return prisma.user.findOne({
where,
...select,
});
},
});
},
});
您能不能尝试使用我的 pal c
命令从列表中启动示例,并尝试使用其架构并进行测试
Can you please try to use my pal c
command to start an example from my list and try your schema and make tests with it
这篇关于Prisma2:如何使用Paljs解决n +1问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!