Closed8
PrismaとApollo ServerでGraphQLサーバーを構築する
簡単なCRUD
はできたけど、認証・認可がまだこれからだからやりたい
個人開発ではGoogle OAuth2だけ使えればとりあえずよいから、それためす
↓みるかも
schema.prisma内でenum定義したあと、nexusのobjectTypeでfield定義するときに、いちいち自分でenum再定義しなきゃいけない
とりあえず↓の感じでごまかしたけどいいやり方あるのかな
なんかどの書き方が正解なのかいまいちわからん、というかPrismaとNexusの関係性とかがわかってないのかも
userObject.ts
import { Role, Status } from "@prisma/client";
import { enumType, objectType } from "nexus";
import { User } from "nexus-prisma";
const roleEnum = enumType({
name: "Role",
members: Object.values(Role),
});
const statusEnum = enumType({
name: "Status",
members: Object.values(Status),
});
export const userObject = objectType({
name: User.$name,
description: User.$description,
definition: (t) => {
t.field(User.id);
t.field(User.username);
t.field(User.nickname);
t.field(User.email);
t.field(User.role.name, { type: roleEnum });
t.field(User.status.name, { type: statusEnum });
t.field(User.createdAt);
t.field(User.updatedAt);
},
});
今回はでも使わないかb
resolver引数のctxに認証済みであるかどうかのフラグとか持たせたいけど型だけうまくあわない。
context.ts
export const context = async (ctx: ExpressContext) => {
const authorization = ctx.req.headers.authorization || "";
// console.log(authorization);
// const tokenInfo = oAuth2Client.getTokenInfo(authorization);
// console.log("tokenInfo", tokenInfo);
// eslint-disable-next-line no-console
// console.log(tokenInfo);
// if (!tokenInfo) throw Error("No Token");
return { prisma, hoge: "fuga" };
};
こんな感じにしてやるとresolver
内でctx.hoge
からfuga
が取得できるんだけど型があわない
schema.ts
import { GraphQLEnumType } from "graphql";
import { GraphQLBigInt, GraphQLDateTime, GraphQLEmailAddress } from "graphql-scalars";
import { asNexusMethod, connectionPlugin, makeSchema } from "nexus";
import * as allTypes from "./schemas";
export const schema = makeSchema({
types: [
allTypes,
asNexusMethod(GraphQLBigInt, "bigint", "bigint"),
asNexusMethod(GraphQLDateTime, "datetime", "datetime"),
asNexusMethod(GraphQLEmailAddress, "email", "email"),
// asNexusMethod(GraphQLURL, "url", "url"),
GraphQLEnumType,
],
outputs: {
schema: __dirname + "/generated/schema.graphql",
typegen: __dirname + "/generated/nexus.ts",
},
contextType: {
module: require.resolve("./context"),
export: "Context",
},
sourceTypes: {
modules: [
{
module: "@prisma/client",
alias: "prisma",
},
],
},
plugins: [
connectionPlugin({
extendConnection: {
totalCount: { type: "Int", requireResolver: false },
},
}),
],
});
ここcontextTypeあたりが原因かも。context.tsでのcontext自体は型があってる
あ、普通にcontext.tsのContext型か
ついでにcontext関数の戻り値にContext型指定した。絶対このほうがいいじゃn
- デコレーター実装 https://qiita.com/taqm/items/4bfd26dfa1f9610128bc
- Google認証実装
- スクレイピング実装
とかとかやりたい。
このスクラップは2022/02/11にクローズされました