このチュートリアルでは、PrismaとGraphQLを使って簡単なユーザー情報を扱うAPIを作成します。 所要時間:約30分
# プロジェクトディレクトリの作成
mkdir prisma-graphql-demo
cd prisma-graphql-demo
# package.jsonの初期化
npm init -y
# 必要なパッケージのインストール
npm install typescript ts-node @types/node prisma @prisma/client apollo-server-express graphql type-graphql reflect-metadata express
# TypeScript設定
npx tsc --init
# Prismaの初期化
npx prisma init
# prisma/schema.prismaを以下の内容で作成
prisma datasource db { provider = "sqlite" url = "file:./dev.db" }
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
}
bash
npx prisma migrate dev --name init
src/index.ts を作成:
typescript import 'reflect-metadata'; import { ApolloServer } from 'apollo-server-express'; import { buildSchema } from 'type-graphql'; import { PrismaClient } from '@prisma/client'; import express from 'express'; import { ObjectType, Field, ID, Resolver, Query, Mutation, Arg } from 'type-graphql';
// Prismaクライアントのインスタンス化
const prisma = new PrismaClient();
// User型の定義
@ObjectType()
class User {
@Field(() => ID)
id: number;
@Field()
name: string;
@Field()
email: string;
}
// リゾルバーの定義
@Resolver(User)
class UserResolver {
// ユーザー一覧取得
@Query(() => [User])
async users() {
return prisma.user.findMany();
}
// ユーザー作成
@Mutation(() => User)
async createUser(
@Arg('name') name: string,
@Arg('email') email: string,
) {
return prisma.user.create({
data: {
name,
email,
},
});
}
}
// サーバーの起動
async function main() {
const app = express();
const schema = await buildSchema({
resolvers: [UserResolver],
});
const server = new ApolloServer({
schema,
});
await server.start();
server.applyMiddleware({ app });
app.listen(4000, () => {
console.log('Server is running on http://localhost:4000/graphql');
});
}
main().catch(console.error);
bash
npx ts-node src/index.ts
ブラウザで http://localhost:4000/graphql にアクセスし、以下のクエリを試してみましょう:
graphql
mutation {
createUser(name: "John Doe", email: "john@example.com") {
id
name
email
}
}
# ユーザー一覧取得
query {
users {
id
name
email
}
}
エラーが発生した場合は以下を確認してください:
すべての依存パッケージが正しくインストールされているか
TypeScriptの設定が正しいか
Prismaのマイグレーションが成功しているか