Рубрики
Без рубрики

Graphql: Создайте свой API с помощью TypeScript и Decerators с Rakkit

Какая? Хорошо, это связано с моей предыдущей статьей о Ракките. Так что я посоветую тебе … Tagged с помощью TypeScript, GraphQL, WebDev, JavaScript.

Хорошо, это связано с моим Предыдущая статья о Rakkit Анкет Поэтому я посоветую вам пойти осмотреть 😊. Итак, здесь я покажу вам более конкретный пример того, что вы можете сделать, используя Rakkit для создания API GraphQL с системой управления пользователями.

Таким образом, есть несколько зависимостей, которые мы должны установить, чтобы продолжить:

Здесь я бы использовал Аполлон Сервер Но также возможно установить Аполлон-Сервер-Коа Если вы используете Rakkit для Rest и GraphQL, который позволяет вам связывать контексты.

Просто запустите эту команду, чтобы установить необходимые зависимости:

npm i rakkit graphql @types/graphql apollo-server reflect-metadata

Refert-metadata позволяет нам использовать декораторы с помощью TypeScript

Хорошо, круто, теперь нам просто нужно настроить TypeScript, чтобы включить декораторы, создав tsconfig.json Файл в корне проекта, содержащий это:

{
  "compileOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "module": "commonjs",
    "target": "es2016",
    "noImplicitAny": false,
    "sourceMap": true,
    "outDir": "build",
    "declaration": true,
    "importHelpers": true,
    "forceConsistentCasingInFileNames": true,
    "lib": [
      "es2016",
      "esnext.asyncitable"
    ],
    "moduleResolution": "node"
  }
}

./tsconfig.json

Хорошо, тогда давайте начнем с создания нашего Пользователь класс, который нам придется украсить с помощью @ObjectType () :

import { ObjectType, Field } from "rakkit";
import * as Crypto from "crypto";

@ObjectType()
export class User {
  @Field()
  username: string;

  @Field()
  email: string;

  @Field()
  id: string;

  // Just to show a computed property:
  @Field(type => String)
  get flatInfos(): string {
    return [this.name, this.email, this.id].join(":");
  }

  constructor(username: string, email: string) {
    this.username = username;
    this.email = email;
    this.id = Crypto.randomBytes(16).toString("hex");
  }
}

./types/User.ts

Поэтому нам придется играть с некоторыми пользователями, чтобы проверить наше приложение, поэтому я просто собираюсь создать список экземпляров пользователей, чтобы прояснить:

Вы можете использовать реальную базу данных с такими ORM, как Typeorm для ваших проектов

import { User } from "../types/User";

export const users = [
  new User("JohnDoe", "john@doe.com"),
  new User("JaneDoe", "jane@doe.com"),
  new User("Ben", "ben@doe.com")
];

./db/users.ts

Именно в следующем классе мы определим наш запрос/мутацию/подписку. Он будет содержать простой CRUD и подписку, которая будет уведомлена при регистрации пользователя:

import {
  Resolve,
  Query,
  Mutation,
  Subscription,
  IContext,
  Arg
} from "rakkit";
import { User } from "../types/User";
import { users } from "../db/users";

@Resolver()
export class UserResolver {
  @Query(returns => [User])
  getAllUsers() { {
    return users;
  }

  @Query({ nullable: true })
  getOneUserByName(@Arg("name") name: string): User {
    return users.find((user) => user.name ==== name);
  }

  @Mutation()
  addUser(
    // Defining the mutation arguments
    @Arg("name") name: string,
    @Arg("email") email: string,
    context: IContext
  ): User {
    const user = new User(name, email);
    users.push(user);
    // Publish the event for subscriptions with the created user
    context.gql.pubSub.publish("USER_ADDED", user);
    return user;
  }

  @Subscription({ topics: "USER_ADDED" })
  userAddedNotif(createdUser: User): User {
    // Send the created user to the client
    return createdUser;
  }
}

./resolvers/userresolver.ts

Теперь нам нужно иметь точку входа для нашего приложения:

// It allows us to use decorators:
import "reflect-metadata";

import { Rakkit } from "rakkit";
import { ApolloServer } from "apollo-server";

async function bootstrap() {
  await Rakkit.start({
    gql: {
      // You give an array of glob string:
      resolvers: [`${__dirname}/resolvers/*Resolver.ts`]
    }
  });
  // Retrieve the GraphQL compiled schema:
  const schema = Rakkit.MetadataStorage.Gql.Schema;

  const server = new ApolloServer({
    schema
  });

  server.listen();
}

bootstrap();

./bootstrap.ts

Чтобы начать его, вы должны установить TS-Node Во всем мире, чтобы прямо запустить приложение TypeScript:

npm i -g ts-node

Тогда просто запустите это:

ts-node relative-path-to/bootstrap.ts

И просто перейти к http://localhost: 4000 С вашим любимым браузером, чтобы сделать несколько запросов GraphQL! 🔥

Getallusers – Получите всех пользователей:

GetoneUserByName – Получите конкретного пользователя по имени:

Adduser – Добавьте пользователя:

userAddednotif – Слушайте событие создания пользователя:

Оригинал: “https://dev.to/daven/graphql-create-your-api-using-typescript-and-decorators-with-rakkit-2koo”