Instagramクローンコード2日目-BE


#1.5 Prisma Client
クライアントはDatabaseとどのように対話していますか.
クライアントはnode modulesに存在する
node_modules/@prisma/client
typedefinitionはschemaで作成されたように手動で適用する必要があります.
必須シンボル
  • *.prisma -> (required) String , (not required) String?
  • typedefs.js -> (required) String! , (not required) String
  • Movie CRUD
    // server.js
    import { PrismaClient } from "@prisma/client";
    import { ApolloServer, gql } from "apollo-server";
    
    const client = new PrismaClient();
    
    const typeDefs = gql`
        type Movie{
            id: Int!
            title: String!
            year: Int!
            genre: String
            createdAt: String!
            updatedAt: String!
        }
        type Query{
            movies: [Movie]
            movie(id: Int!): Movie
        }
        type Mutation{
            createMovie(title: String! year: Int! genre: String): Movie!
            deleteMovie(id: Int!): Movie
            updateMovie(id: Int! year: Int): Movie
        }
    `;
    
    const resolvers = {
        Query: {
            movies: () => client.movie.findMany(),
            movie: (_, { id }) => client.movie.findUnique({ where: { id }, }),
        },
        Mutation: {
            createMovie: (_, { title, year, genre }) =>
                client.movie.create({
                    data: {
                        title,
                        year,
                        genre
                    },
                }),
            deleteMovie: (_, { id }) =>
                client.movie.delete({ where: { id }, }),
            updateMovie: (_, { id, year }) =>
                client.movie.update({ where: { id }, data: { year }, }),
        },
    };
    #1.6 Prisma studio
    prisma studioはビジュアル化エディタです.npx prisma studioprisma studio is a visual editor for the data. (default port : 5555)
    filter:lt(より小さい)、lte(より小さい)、gt(より大きい)、gte(より大きい)
    #1.7 Architecture
    Divide & conquer
    type、query、変異をドメインから独立したファイルとして管理します.
    client.js(prismaクライアントの初期化と管理)
    schemaからtypeDefsと解析器をインポート
    (デフォルトでは、typedefsおよび解析ファイルごとにclientをインポートする必要があります)
    graphql-toolsを使用してフォルダ構造からすべてのtypedefsと解析器ファイルを読み込みます.npm i graphql-toolsファイルパスパターンをloadFilesSyncで定義します.
  • filenameは、現在実行中のファイルパス
  • です.
  • dirnameは現在実行中のフォルダパスです
    /**/*.typeDefs.js:すべてのフォルダ内のすべての名前のtypeDefs.js
    **はフォルダ、*はファイルを表します.
  • makeExecutableSchemaを使用してtypedefと解析器を1つのモードとして定義します.
    loadfilessyncは、各ファイルのexport defaultを読み込みます.
    // schema.js
    import { loadFilesSync, makeExecutableSchema, mergeResolvers, mergeTypeDefs, } from "graphql-tools";
    
    const loadTypes = loadFilesSync(`${__dirname}/**/*.typeDefs.js`);
    const loadReslovers = loadFilesSync(`${__dirname}/**/*.{queries,mutations}.js`); 
    //queries와 mutations사이에 절대 공백이 들어와서는 안된다.
    
    const typeDefs = mergeTypeDefs(loadTypes);
    const resolvers = mergeResolvers(loadReslovers);
    
    const schema = makeExecutableSchema({ typeDefs, resolvers });
    
    export default schema;
    import client from "../client"; import { client } from "../client";importではカッコの違いがあります.以上の場合、default exportのみがインポートされます.ただし、下図に示すように、clientというdefault exportのないモジュールの特定のメンバーがインポートされた場合は、モジュールをインポートします.したがって、以下の場合は未定義です.
    #1.8 Dotenvnpm install dotenv.envを読むにはdotvnvをインストールする必要があります.
    appではtop上でdotnvを実行する必要があります.
    require('dotenv').config();
    process.env.#### 環境変数アクセス
    .gitignoreでは、アップロードされたファイルを除いてexplorerでグレーでシェーディングされます.