افزودن mutation ها به ExpressJS

افزودن mutation ها به ExpressJS

افزودن mutation ها به ExpressJS

در جلسه ی قبل با شیوه ی ایجاد کوئری های پیچیده تر در ExpressJS آشنا شدید. در این جلسه قصد داریم تا با شیوه ی ساخت mutation ها در ExpressJS آشنا شویم.

Mutation چیست؟

Mutation ها همانند query ها تعریف شده و عمل می کنند. با این تفاوت که آن ها به جای دریافت اطلاعات از سرور، اطلاعات را ایجاد و یا ویرایش می کنند. در واقع می توان mutation ها را معادل post یا put در RESTful API در نظر گرفت. در عمل می توان به جای mutation ها از query ها استفاده کرد. اما برای داشتن یک schema ی بهتر از mutation ها استفاده می کنیم. 

ساخت Mutation ها:

برای ساخت mutation ها، کافیست در فایل schema.js در پوشه ی graphql، mutation را به GrahpQLSchema اضافه کنیم. فایل بیان شده را به صورت زیر تغییر دهید:

const { GraphQLSchema, GraphQLObjectType } = require('graphql');
const HelloQuery = require('./queries/Hello');
const ContactsQuery = require('./queries/Contacts');
const ContactQuery = require('./queries/Contact');
const StoreContactMutation = require('./mutations/StoreContact');

const Schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'RootQuery',
    fields: {
      hello: HelloQuery,
      contacts: ContactsQuery,
      contact: ContactQuery,
    },
  }),
  mutation: new GraphQLObjectType({
    name: 'RootMutation',
    fields: {
      storeContact: StoreContactMutation,
    },
  }),
});

module.exports = Schema;

اگر دقت کرده باشید، mutation ی به نام storeContact در قسمت fields وجود دارد. این mutation اطلاعات مربوط به یک مخاطب را از کلاینت دریافت و در سرور آن را ایجاد می کند.  برای تعریف آن ابتدا پوشه ای به نام mutations در پوشه ی graphql ساخته و سپس فایل storeContact.js را در آن ایجاد کنید. سپس کدهای زیر را در آن قرار دهید:

const ContactType = require('../types/contact');
const Contact = require('../../models/contact');
const { GraphQLNonNull, GraphQLString } = require('graphql');
const AddressInput = require('../inputs/Address');

const StoreContactMutation = {
  type: ContactType,
  args: {
    name: {
      type: GraphQLNonNull(GraphQLString),
    },
    phone: {
      type: GraphQLNonNull(GraphQLString),
    },
    address: {
      type: GraphQLNonNull(AddressInput),
    },
  },
  resolve(parent, args) {
    const newCotact = {
      name: args.name,
      phone: args.phone,
      address: args.address
    };

    return Contact.store(newCotact);
  },
};

module.exports = StoreContactMutation;

اگر دقت کرده باشید mutation ها مانند کوئری ها تعریف می شوند. درقسمت args برای نوع address از یک input type استفاده شده است (در درس پنجم توضیح داده شد). برای تعریف آن پوشه ای به نام inputs در پوشه ی graphql ایجاد کنید. سپس فایل address.js را در آن ساخته و کدهای زیر را در آن قرار دهید:

const { GraphQLString, GraphQLInputObjectType } = require('graphql');

const AddressInput = new GraphQLInputObjectType({
  name: 'AddressInput',
  fields: {
    country: {
      type: GraphQLString,
    },
    city: {
      type: GraphQLString,
    },
  },
});

module.exports = AddressInput;

همچنین برای حذف یک Contact می توان یک mutation دیگر به عنوان deleteContact تعریف کرد. برای این کار فایل deleteContact.js را در پوشه ی mutations ایجاد کنید. سپس کدهای زیر را در آن قرار دهید:

const ContactType = require('../types/contact');
const Contact = require('../../models/contact');
const { GraphQLNonNull, GraphQLString } = require('graphql');

const DeleteContactMutation = {
  type: ContactType,
  args: {
    contactId: {
      type: GraphQLNonNull(GraphQLString),
    },
  },
  resolve(parent, args) {
    return Contact.deleteById(args.contactId);
  },
};

module.exports = DeleteContactMutation;

و در نهایت برای اضافه کردن آن به schema، فایل schema.js در پوشه ی graphql را به صورت زیر ویرایش کنید:

const { GraphQLSchema, GraphQLObjectType } = require('graphql');
const HelloQuery = require('./queries/Hello');
const ContactsQuery = require('./queries/Contacts');
const ContactQuery = require('./queries/Contact');
const StoreContactMutation = require('./mutations/StoreContact');
const DeleteContactMutation = require('./mutations/deleteContact');

const Schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'RootQuery',
    fields: {
      hello: HelloQuery,
      contacts: ContactsQuery,
      contact: ContactQuery,
    },
  }),
  mutation: new GraphQLObjectType({
    name: 'RootMutation',
    fields: {
      addContact: StoreContactMutation,
      deleteContact: DeleteContactMutation,
    },
  }),
});

module.exports = Schema;

حال برنامه را اجرا کنید و وارد localhost:3000/graphql شوید. می توانید mutation های تعریف شده خود را اجرا کنید:

بسیار عالی! اپلیکیشن مورد نظر ما کامل شده است و می توان با آن لیست مخاطبین را به کمک graphql مدیریت کرد. می توانید source این پروژه را از لینک github زیر دریافت کنید: 

https://github.com/CodeArtisT75/sa-gql-express-course

امیدوارم این درس برای شما مفید واقع شده باشد. غرق در آرامش باشید.

نظرات
اگر login نکردی برامون ایمیلت رو بنویس: