Jacobvu84 / nest-graphql-api-test

graphql-api testing demo
0 stars 0 forks source link

Cấu trúc post request với GraphQL API #8

Open Jacobvu84 opened 1 year ago

Jacobvu84 commented 1 year ago

Interface

import * as request from 'supertest';

export interface Irequest {
  useMutation(
    operationName: string,
    query: string,
    variables: any,
    headers?: any,
  ): Promise<any>;
}

Implementation


export class GraphQLClient implements Irequest {
  async useMutation(
    operationName: string,
    query: string,
    variables: any,
    headers: any = {},
  ): Promise<any> {
    const response = request('https://your-domain')
      .post('/graphql')
      .send({
        operationName,
        query,
        variables,
      })
      .set('Bearer 1234eyJraWQiOiYD98934JtcFI0MHFRVnp') // set token is default
      .set(headers); // add more header<key:value> 

    return response;
  }
}

export const graphQLClient: Irequest = new GraphQLClient();

Usage

1. Query

export const accountQuery = `
    mutation createAccount($input: AccountInput) {
      createAccount(input: $input) {
        id
      }
    }
`;

2. Variables

export const accountInput = {
  input: {
    name: 'jacob@testgpt.com',
    password: 'deptraicogilasai@2023',
  },
};

2. Use graphql client object

async function createAccount() {
  const response = await graphQLClient.useMutation(
    'createAccount',
    accountQuery,
    accountInput,
    {'Content-Type': 'text/html'} // this is option
  );

  console.log('response data:', response); // return response data 
 console.log('response data:', response. createAccount.id); // return account id
}

1/ Cài supertest

Theo hướng dẫn ở đây. It should be installed when generating the project with nest. https://github.com/Jacobvu84/nest-graphql-api-test/issues/1

npm install supertest --save-dev

2/ Ý nghĩa của một số từ khoá

// Java
final int MAX_VALUE = 100;

// Typescripts
const MAX_VALUE = 100;
Jacobvu84 commented 1 year ago

Promise là gì ?

Promise là một đối tượng được sử dụng để đại diện cho một giá trị có thể trả về trong tương lai hoặc một hành động có thể hoàn thành trong tương lai.

Promise có ba trạng thái chính là:

Xét ví dụ

async function getData() {
  const response = await fetch('https://example.com/data');
  const data = await response.json();
  return data;
}

getData()
  .then(data => {
    // xử lý kết quả trả về
  })
  .catch(error => {
    // xử lý lỗi
  });

thì promise ở đây là fetchresponse.json()

Promise được xây dựng bằng cách sử dụng cấu trúc có hai tham số đầu vào: một hàm executor và một hàm callback. Hàm executor sẽ được gọi ngay khi promise được tạo và nhận hai tham số là hai hàm "resolve" và "reject" để giải quyết hoặc từ chối promise. Hàm callback sẽ được gọi khi promise được giải quyết hoặc từ chối để xử lý kết quả trả về hoặc lỗi.

const promise = new Promise((resolve, reject) => {
  // tác vụ bất đồng bộ
  const result = doSomething();

  if (result) {
    resolve(result); // giải quyết promise nếu thành công
  } else {
    reject('Error'); // từ chối promise nếu có lỗi xảy ra
  }
});

promise.then((result) => {
  // xử lý kết quả trả về khi promise được giải quyết
}).catch((error) => {
  // xử lý lỗi khi promise bị từ chối hoặc có lỗi xảy ra
});

Trong ví dụ trên, chúng ta tạo một Promise và thực hiện một tác vụ bất đồng bộ bên trong hàm executor. Nếu tác vụ hoàn thành thành công, chúng ta sử dụng hàm "resolve" để giải quyết promise và trả về kết quả. Nếu có lỗi xảy ra, chúng ta sử dụng hàm "reject" để từ chối promise và trả về thông tin lỗi.

Sau đó, chúng ta sử dụng phương thức "then" để đăng ký một hàm callback được gọi khi promise được giải quyết thành công. Phương thức "then" nhận một tham số là hàm callback được gọi với kết quả trả về của promise khi nó được giải quyết thành công. Chúng ta cũng có thể sử dụng phương thức "catch" để đăng ký một hàm callback được gọi khi promise bị từ chối hoặc có lỗi xảy ra.

Khi promise được giải quyết thành công hoặc bị từ chối, nó sẽ không thay đổi trạng thái của nó. Nếu bạn muốn thực hiện nhiều tác vụ bất đồng bộ liên tiếp, bạn có thể sử dụng phương thức "then" để nối chúng lại với nhau.

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 1');
  }, 2000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 2');
  }, 1000);
});

promise1
  .then((result) => {
    console.log(result); // "Promise 1"
    return promise2;
  })
  .then((result) => {
    console.log(result); // "Promise 2"
  })
  .catch((error) => {
    console.log(error);
  });

rong ví dụ trên, chúng ta tạo hai Promise và sử dụng phương thức "setTimeout" để giả lập tác vụ bất đồng bộ. Sau đó, chúng ta sử dụng phương thức "then" để nối các Promise lại với nhau và xử lý kết quả trả về khi chúng được giải quyết. Nếu bất kỳ Promise nào bị từ chối hoặc có lỗi xảy ra, chúng ta sử dụng phương thức "catch" để xử lý lỗi đó.