Хорошо, это связано с моим Предыдущая статья о 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”