ubuntu

ساخت و استقرار سرور GraphQL با Node.js و MongoDB

GraphQL در سال 2015 توسط فیس بوک به عنوان یک زبان پرس و جو برای API ها منتشر شد که پرس و جو و جهش داده ها از مجموعه داده های مختلف را آسان می کند. از یک نقطه پایانی واحد ، می توانید چندین منبع داده را با یک درخواست POST منفرد جستجو کنید و به جش واردارید. GraphQL برخی از نقص طراحی معمول در معماری REST API را برطرف می کند ، مانند موقعیت هایی که نقطه انتهایی اطلاعات بیشتری را نسبت به آنچه در واقع لازم دارید برمی گرداند. همچنین ، هنگام استفاده از API های REST ممکن است برای جمع آوری تمام اطلاعات مورد نیاز خود، ممکن است نیاز به ارسال درخواست به چند مورد از نقاط انتهایی REST داشته باشید – وضعیتی که به آن مشکل n + 1 گفته می شود. نمونه ای از این موارد وقتی پیش می آید که می خواهید اطلاعات کاربر را نشان دهید ، اما باید اطلاعاتی از قبیل جزئیات شخصی و آدرس ها را از نقاط مختلف جمع آوری کنید.
این مشکلات برای GraphQL اعمال نمی شوند زیرا تنها یک نقطه پایانی دارد که می تواند داده ها را از چندین مجموعه بازگرداند. داده بازگشتی به پرس و جویی که به این نقطه پایانی ارسال شده بستگی دارد. در این پرس و جو ساختار داده ای را که می خواهید دریافت کنید ، از جمله هر مجموعه داده تو در تو را تعریف می کنید. علاوه بر یک پرس و جو ، می توانید از یک جهش برای تغییر داده ها روی یک سرور مجازی GraphQL و یک اشتراک نیز برای مشاهده تغییرات در داده استفاده کنید. برای کسب اطلاعات بیشتر در مورد GraphQL و مفاهیم آن ، می توانید به مطالب موجود در وب سایت رسمی مراجعه کنید.
از آنجا که GraphQL یک زبان پرس و جو با انعطاف پذیری زیاد است ، به خصوص با داده های مبتنی بر مستندات مانند MongoDB ترکیب می شود. هر دو فناوری مبتنی بر طرحواره های سلسله مراتبی ، تایپ شده هستند و در جامعه جاوا اسکریپت محبوب میباشند. همچنین ، داده های MongoDB به عنوان اشیاء JSON ذخیره می شوند ، بنابراین هیچ تجزیه و تحلیل اضافی در سرور مجازی GraphQL لازم نیست.
در این آموزش ، یک سرور مجازی GraphQL با Node.js ایجاد خواهید کرد و می توانید داده ها را از یک پایگاه داده MongoDB که در اوبونتو 18.04 در حال اجرا است ، پرس و جو کنید و جهش دهید. در پایان این آموزش ، شما می توانید با استفاده از یک نقطه پایانی واحد، هم با ارسال درخواست به سرور مجازی به طور مستقیم از طریق ترمینال و هم با استفاده از رابط پیش ساخته playground در GraphiQL به داده های موجود در بانک اطلاعاتی خود دسترسی داشته باشید. با استفاده از این playground می توانید محتویات سرور مجازی GraphQL را با ارسال پرس و جوها ، جهش ها و اشتراک ها کشف کنید. همچنین ، می توانید نمایش های بصری از طرح هایی را که برای این سرور مجازی تعریف شده است ، پیدا کنید.
در پایان این آموزش ، شما از playground GraphiQL برای ارتباط سریع سرور مجازی GraphQL خود استفاده خواهید کرد:

پیش نیازها
قبل از شروع این راهنما به موارد زیر نیاز خواهید داشت:
سرور مجازی Ubuntu 18.04 که با پیروی از راهنمای تنظیم اولیه سرور مجازی Ubuntu 18.04 تنظیم شده باشد، شامل یک کاربر sudo غیر ریشه و فایروال نیز باشد.
⦁ نصب MongoDB و اجرای آن در اوبونتو 18.04 که می توانید با دنبال کردن آموزش نحوه نصب MongoDB در اوبونتو 18.04 آن را تنظیم کنید.
⦁ Nginx نصب شده ، همانطور که در نحوه نصب Nginx در Ubuntu 18.04 مشاهده می شود ، از جمله مرحله 4 – تنظیم بلوک های سرور مجازی.
⦁ برای دسترسی از راه دور به سرور مجازی GraphQL ، به یک نام دامنه کاملاً واجد شرایط (FQDN) و یک رکورد A نیاز دارید که به IP سرور مجازی شما اشاره کند. در صورت داشتن حساب vpsgol ، می توانید اطلاعات بیشتری در مورد این مورد با خواندن طریق مقدمه DNS اصطلاحات ، مؤلفه ها و مفاهیم ، یا اسناد دامنه و DNS کسب کنید.
⦁ آشنایی با JavaScript ، که می توانید از مجموعه نحوه کدنویسی در جاواسکریپت بیاموزید.
مرحله 1 – تنظیم بانک اطلاعاتی MongoDB
قبل از ایجاد سرور مجازی GraphQL ، اطمینان حاصل کنید که پایگاه داده شما درست پیکربندی شده باشد ، تأیید هویت آن فعال باشد و با داده های نمونه پر شده باشد. برای این کار باید از اعلان خط فرمان به سرور مجازی Ubuntu 18.04 که پایگاه داده MongoDB است متصل شوید. کلیه مراحل این آموزش در این سرور مجازی انجام خواهد شد.
بعد از برقراری اتصال ، دستور زیر را اجرا کنید تا بررسی کنید که آیا MongoDB فعال و روی سرور مجازی شما فعال است:
⦁ $ sudo systemctl status mongodb

خروجی زیر را در ترمینال خود مشاهده خواهید کرد ، نشان می دهد که بانک اطلاعاتی MongoDB به طور فعال در حال اجرا است:
Output
● mongodb.service – An object/document-oriented database
Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2019-02-23 12:23:03 UTC; 1 months 13 days ago
Docs: man:mongod(1)
Main PID: 2388 (mongod)
Tasks: 25 (limit: 1152)
CGroup: /system.slice/mongodb.service
└─2388 /usr/bin/mongod –unixSocketPrefix=/run/mongodb –config /etc/mongodb.conf

قبل از ایجاد دیتابیس که داده های نمونه را در آن ذخیره می کنید ، ابتدا باید یک کاربر ادمین ایجاد کنید ، زیرا کاربران عادی در یک پایگاه داده خاص قرار می گیرند. می توانید با اجرای دستور زیر که پوسته MongoDB را باز می کند ، این کار را انجام دهید:
⦁ $ mongo

با پوسته MongoDB دسترسی مستقیم به پایگاه داده MongoDB خواهید داشت و می توانید کاربران یا بانکهای اطلاعاتی و داده های پرس و جو ایجاد کنید. در داخل این پوسته ، دستور زیر را اجرا کنید که یک کاربر ادمین جدید را به MongoDB اضافه می کند. می توانید کلمات کلیدی هایلایت شده را با نام کاربری و رمز ورود خود جایگزین کنید ، اما فراموش نکنید که آنها را در جایی بنویسید.
⦁ mongo> use admin

⦁ mongo> db.createUser({

⦁ mongo> user: “admin_username”,

mongo> pwd: “admin_password”,

⦁ mongo> roles: [{ role: “root”, db: “admin”}]

⦁ mongo> })

خط اول دستور قبلی دیتابیس را با نام ادمین انتخاب می کند ، یعنی همان دیتابیسی که تمام نقش های ادمین در آن ذخیره می شود. با روش db.createUser () می توانید کاربر واقعی ایجاد کرده و نام کاربری ، رمزعبور و نقش های آن را تعریف کنید.
اجرای این فرمان خروجی زیر را برمی گرداند:
Output
Successfully added user: {
“user” : “admin_username”,
“roles” : [
{
“role” : “root”,
“db” : “admin”
}
]
}

اکنون می توانید پوسته MongoDB را با تایپ کردن exit ببندید.
در مرحله بعد ، دوباره وارد پوسته MongoDB شوید ، اما این بار با کاربر adminجدید:
⦁ $ mongo -u “admin_username” -p “admin_password” –authenticationDatabase “admin”

این دستور پوسته MongoDB را به عنوان یک کاربر خاص باز می کند، که در آن پرچم -u نام کاربری و پرچم -p رمز عبور آن کاربر را مشخص می کند. پرچم اضافی –authenticationDatabase مشخص می کند که می خواهید به عنوان ادمین وارد شوید.
در مرحله بعد ، به یک بانک اطلاعاتی جدید می روید و سپس از روش db.createUser () برای ایجاد یک کاربر جدید دارای مجوز برای ایجاد تغییر در این پایگاه داده استفاده می کنید. بخش هایلایت شده را با اطلاعات مورد نظر خود جایگزین کنید ، حتما این مدارک را یادداشت کنید.
دستور زیر را در پوسته MongoDB اجرا کنید:
⦁ mongo> use database_name

⦁ mongo> db.createUser({

⦁ mongo> user: “username”,

⦁ mongo> pwd: “password”,

⦁ mongo> roles: [“readWrite”]

⦁ mongo> })

با این کار خروجی زیر باز می گردد:
Output
Successfully added user: { “user” : “username”, “roles” : [“readWrite”] }

پس از ایجاد دیتابیس و کاربر ، این بانک اطلاعاتی را با داده های نمونه ای پر کنید که بعداً در این آموزش توسط سرور مجازی GraphQL می توانید جستجو کنید. برای این کار ، می توانید از نمونه مجموعه bios از وب سایت MongoDB استفاده کنید. با اجرای دستورات در قطعه کد زیر ، نسخه کوچکتری از این مجموعه داده bios را در پایگاه داده خود وارد می کنید. می توانید بخش های هایلایت شده را با اطلاعات شخصی خود جایگزین کنید ، اما برای اهداف این آموزش ، نام مجموعه را bios بگذارید:
⦁ mongo> db.bios.insertMany([

⦁ mongo> {

⦁ mongo> “_id” : 1,

⦁ mongo> “name” : {

⦁ mongo> “first” : “John”,

⦁ mongo> “last” : “Backus”

⦁ mongo> },

⦁ mongo> “birth” : ISODate(“1924-12-03T05:00:00Z”),

mongo> “death” : ISODate(“2007-03-17T04:00:00Z”),

⦁ mongo> “contribs” : [

⦁ mongo> “Fortran”,

⦁ mongo> “ALGOL”,

⦁ mongo> “Backus-Naur Form”,

⦁ mongo> “FP”

⦁ mongo> ],

⦁ mongo> “awards” : [

⦁ mongo> {

⦁ mongo> “award” : “W.W. McDowell Award”,

⦁ mongo> “year” : 1967,

⦁ mongo> “by” : “IEEE Computer Society”

⦁ mongo> },

⦁ mongo> {

⦁ mongo> “award” : “National Medal of Science”,

⦁ mongo> “year” : 1975,

⦁ mongo> “by” : “National Science Foundation”

⦁ mongo> },

⦁ mongo> {

⦁ mongo> “award” : “Turing Award”,

⦁ mongo> “year” : 1977,

⦁ mongo> “by” : “ACM”

⦁ mongo> },

⦁ mongo> {

⦁ mongo> “award” : “Draper Prize”,

⦁ mongo> “year” : 1993,

⦁ mongo> “by” : “National Academy of Engineering”

⦁ mongo> }

⦁ mongo> ]

mongo> },

⦁ mongo> {

⦁ mongo> “_id” : ObjectId(“51df07b094c6acd67e492f41”),

⦁ mongo> “name” : {

⦁ mongo> “first” : “John”,

mongo> “last” : “McCarthy”

⦁ mongo> },

⦁ mongo> “birth” : ISODate(“1927-09-04T04:00:00Z”),

⦁ mongo> “death” : ISODate(“2011-12-24T05:00:00Z”),

⦁ mongo> “contribs” : [

⦁ mongo> “Lisp”,

⦁ mongo> “Artificial Intelligence”,

⦁ mongo> “ALGOL”

⦁ mongo> ],

⦁ mongo> “awards” : [

⦁ mongo> {

⦁ mongo> “award” : “Turing Award”,

⦁ mongo> “year” : 1971,

⦁ mongo> “by” : “ACM”

⦁ mongo> },

⦁ mongo> {

mongo> “award” : “Kyoto Prize”,

⦁ mongo> “year” : 1988,

⦁ mongo> “by” : “Inamori Foundation”

⦁ mongo> },

⦁ mongo> {

⦁ mongo> “award” : “National Medal of Science”,

⦁ mongo> “year” : 1990,

⦁ mongo> “by” : “National Science Foundation”

⦁ mongo> }

⦁ mongo> ]

⦁ mongo> }

⦁ mongo> ]);

این بلوک کد آرایه ای از آبجکت های مختلفی است که حاوی اطلاعات مربوط به دانشمندان موفق گذشته میباشد. پس از اجرای این دستورات برای وارد کردن این مجموعه به پایگاه داده خود ، پیام زیر را دریافت خواهید کرد که نشان می دهد داده ها اضافه شده اند:
Output
{
“acknowledged” : true,
“insertedIds” : [
1,
ObjectId(“51df07b094c6acd67e492f41”)
]
}

پس از مشاهده پیام موفقیت ، می توانید پوسته MongoDB را با تایپ کردن exit ببندید. در مرحله بعد ، نصب MongoDB را پیکربندی کنید تا مجوز را فعال کنید و فقط کاربران معتبر بتوانند به داده ها دسترسی پیدا کنند. برای ویرایش پیکربندی نصب MongoDB ، فایل حاوی تنظیمات این نصب را باز کنید:
⦁ $ sudo nano /etc/mongodb.conf

برای فعال کردن مجوز ، خط هایلایت شده را در کد زیر را باطل کنید:
/etc/mongodb.conf

# Turn on/off security. Off is currently the default
#noauth = true
auth = true

برای فعال کردن این تغییرات ، MongoDB را مجدداً راه اندازی کنید:
⦁ $ Sudo systemctl restart mongodb

با اجرای دستور مطمئن شوید که پایگاه داده دوباره در حال اجرا است:
⦁ $ sudo systemctl status mongodb

خروجی زیر را مشاهده خواهید کرد:
Output
● mongodb.service – An object/document-oriented database
Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2019-02-23 12:23:03 UTC; 1 months 13 days ago
Docs: man:mongod(1)
Main PID: 2388 (mongod)
Tasks: 25 (limit: 1152)
CGroup: /system.slice/mongodb.service
└─2388 /usr/bin/mongod –unixSocketPrefix=/run/mongodb –config /etc/mongodb.conf

برای اطمینان از اینکه کاربر شما می تواند به دیتابیسی که ایجاد کرده اید وصل شود ، سعی کنید پوسته MongoDB را به عنوان یک کاربر معتبر با دستور زیر باز کنید:
⦁ $ mongo -u “username” -p “password” –authenticationDatabase “database_name”

از همان پرچم های قبلی استفاده میکند، فقط این بار –authenticationDatabase روی پایگاه داده ای که ایجاد کرده اید تنظیم میشود و با داده های نمونه پر میگردد.
اکنون با موفقیت یک کاربر ادمین و کاربر دیگری را اضافه کرده اید که دسترسی به خواندن / نوشتن اطلاعات پایگاه داده با داده های نمونه را دارد. همچنین ، پایگاه داده دارای مجوزهای فعال است به این معنی که یک نام کاربری و رمزعبور برای دسترسی به آن نیاز دارید. در مرحله بعد سرور مجازی GraphQL را ایجاد خواهید کرد که بعداً در آموزش به این پایگاه داده وصل می شود.
مرحله دوم – ایجاد سرور مجازی GraphQL
با پیکربندی پایگاه داده و پر شدن با داده های نمونه ، زمان آن رسیده که یک سرور مجازی GraphQL ایجاد کنیم که بتواند این داده ها را پرس و جو کند و جهش دهد. برای این کار از Express و express-Graphql استفاده می کنید ، که هر دو در Node اجرا می شوند. Express یک چارچوب سبک برای ایجاد سریع سرور مجازی های HTTP Node.js است و Express-Graphql میان افزار را برای ایجاد سریع سرور مجازی های GraphQL امکان پذیر می کند.
اولین قدم اطمینان از به روزرسانی دستگاه شما است:
⦁ $ sudo apt update

در مرحله بعد با اجرای دستورات زیر Node.js را روی سرور مجازی خود نصب کنید. به همراه Node.js همچنین npm را نصب خواهید کرد ، یک مدیر بسته برای JavaScript که روی Node.js. اجرا می شود.
⦁ $ sudo apt install nodejs npm

پس از طی مراحل نصب ، بررسی کنید که آیا نسخه Node.js که اخیراً نصب کرده اید v8.10.0 یا بالاتر است:
⦁ $ node -v

با این کار خروجی زیر باز می گردد:
Output
v8.10.0

برای شروع یک پروژه جدید JavaScript ، دستورات زیر را به عنوان کاربر sudo روی سرور مجازی اجرا کنید و کلمات کلیدی هایلایت شده را با نامی برای پروژه خود جایگزین کنید.
ابتدا وارد دیرکتوری اصلی سرور مجازی خود شوید:
⦁ $ cd

پس از آنجا دایرکتوری جدیدی به همراه نام پروژه خود ایجاد کنید:
⦁ $ mkdir project_name

به این دیرکتوری بروید:
⦁ $ cd project_name

در آخر ، یک بسته npm جدید را با دستور زیر تنظیم کنید:
⦁ $ sudo npm init -y

بعد از اجرای npm init- پیام موفقیتی را دریافت خواهید کرد که فایل pack.json زیر ایجاد شده است:
Output
Wrote to /home/username/project_name/package.json:

{
“name”: “project_name”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}

توجه: همچنین می توانید npm init را بدون پرچم -y اجرا کنید ، که پس از آن به سؤالات مختلفی برای تنظیم نام پروژه ، نویسنده ، و غیره پاسخ می دهید. می توانید جزئیات را وارد کنید یا فقط برای ادامه کلید Enter را بزنید.

اکنون که پروژه را آغاز کردید ، بسته های لازم برای راه اندازی سرور مجازی GraphQL را نصب کنید:
⦁ $ sudo npm install –save express express-graphql graphql

یک فایل جدید با نام index.js ایجاد کنید و متعاقباً با اجرای دستور زیر این فایل را باز کنید:
⦁ $ sudo nano index.js

در مرحله بعد ، بلوک کد زیر را در فایل تازه ایجاد شده برای تنظیم سرور مجازی GraphQL اضافه کنید:
index.js
const express = require(‘express’);
const graphqlHTTP = require(‘express-graphql’);
const { buildSchema } = require(‘graphql’);

// Construct a schema, using GraphQL schema language
const schema = buildSchema(`
type Query {
hello: String
}
`);

// Provide resolver functions for your schema fields
const resolvers = {
hello: () => ‘Hello world!’
};

const app = express();
app.use(‘/graphql’, graphqlHTTP({
schema,
rootValue: resolvers
}));
app.listen(4000);

console.log(`🚀 Server ready at http://localhost:4000/graphql`);

این بلوک کد از چندین بخش تشکیل شده است که همه مهم هستند. ابتدا شمای داده هایی را که توسط GraphQL API برگردانده شده است شرح می دهید:
index.js

// Construct a schema, using GraphQL schema language
const schema = buildSchema(`
type Query {
hello: String
}
`);

نوع Query تعریف می کند چه پرس و جوهایی میتوانند اجرا شوند و به چه فرمتی می توانند نتیجه را برگردانند. همانطور که مشاهده می کنید ، تنها پرس و جوی تعریف شده hello است که داده ها را با فرمت String برمی گرداند.
در بخش بعدی ، resolvers تعیین می شوند ، جایی که داده ها با طرح هایی که می توانید پرس و جو کنند ، هماهنگ می شوند:
index.js

// Provide resolver functions for your schema fields
const resolvers = {
hello: () => ‘Hello world!’
};

این resolverها مستقیماً با طرحواره ها مرتبط هستند و داده هایی را که با این طرح ها مطابقت دارد ، برمی گردانند.
قسمت پایانی این بلاک کد سرور مجازی GraphQL را آغاز می کند ، نقطه پایانی API را با Express ایجاد می کند و پورتی را که انتهای GraphQL در آن در حال اجرا است توضیح می دهد:
index.js

const app = express();
app.use(‘/graphql’, graphqlHTTP({
schema,
rootValue: resolvers
}));
app.listen(4000);

console.log(`🚀 Server ready at http://localhost:4000/graphql`);

بعد از افزودن این خطوط ، ذخیره کنید و از index.js خارج شوید.
در مرحله بعد ، برای اجرای سرور مجازی GraphQL ، باید فایل index.js را با Node.js. اجرا کنید. این کار به صورت دستی از خط فرمان قابل انجام است ، اما معمول است که فایل pack.json را تنظیم کنید تا این کار برای شما انجام شود.
فایل pack.json را باز کنید:
⦁ $ sudo nano package.json

خط هایلایت شده زیر را به این فایل اضافه کنید:
package.json
{
“name”: “project_name”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“start”: “node index.js”,
“test”: “echo \”Error: no test specified\” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}
فایل را ذخیره کنید و از آن خارج شوید.
برای راه اندازی سرور مجازی GraphQL ، دستور زیر را در ترمینال اجرا کنید:
⦁ $ npm start

پس از اجرای این برنامه ، اعلان ترمینال ناپدید می شود و پیامی برای تأیید سرور مجازی GraphQL ظاهر می شود:
Output
🚀 Server ready at http://localhost:4000/graphql

اگر اکنون بخش ترمینال دیگری را باز کرده اید ، می توانید با اجرای دستور زیر آزمایش کنید که آیا سرور مجازی GraphQL در حال اجرا است. این کار درخواست POST curlرا با بدنه JSON پس از پرچم –data که شامل پرس و جوی GraphQL شما به نقطه انتهایی محلی است ارسال می کند:
⦁ $ curl -X POST -H “Content-Type: application/json” –data ‘{ “query”: “{ hello }” }’ http://localhost:4000/graphql

با این کار پرس و جو همانطور که در شمای GraphQL در کد شما شرح داده شده است اجرا می شود و داده ها را با فرمت JSON قابل پیش بینی که یکسان با داده های برگشت یافته در resolver هاست، اجرا می کند:
Output
{ “data”: { “hello”: “Hello world!” } }

توجه: در صورت خراب شدن یا گیر نکردن سرور مجازی اکسپرس ، باید فرایند node که روی سرور مجازی اجرا می شود را به صورت دستی از بین ببرید. برای لغو همه این مراحل ، می توانید موارد زیر را اجرا کنید:
⦁ $ killall node

پس از آن می توانید با دستور زیر، سرور مجازی GraphQL مجدداً راه اندازی کنید:
⦁ $ npm start

در این مرحله شما اولین نسخه از سرور مجازی GraphQL را ایجاد کرده اید که هم اکنون در یک نقطه پایانی محلی اجرا می شود که به سرور مجازی شما قابل دسترسی است. در مرحله بعد ، resolver های خود را به پایگاه داده MongoDB وصل خواهید کرد.
مرحله 3 – اتصال به بانک اطلاعاتی MongoDB
با نظم گیری سرور مجازی GraphQL ، اکنون می توانید ارتباط را با پایگاه داده MongoDB که قبلاً پیکربندی کرده و پر از داده کرده اید ، تنظیم نمایید و یک طرح جدید ایجاد کنید که مطابق با این داده ها باشد.
برای اینکه بتوانید از سرور مجازی GraphQL به MongoDB متصل شوید ، بسته JavaScript را برای MongoDB از npm نصب کنید:
⦁ $ sudo npm install –save mongodb

پس از نصب ، index.js را در ویرایشگر متن خود باز کنید:
⦁ $ sudo nano index.js

سپس ، کد هایلایت شده زیر را درست بعد از متعلقات وارد شده به index.js اضافه کنید و مقادیر هایلایت شده را با جزئیات اتصال خود به پایگاه داده محلی MongoDB پر کنید. نام کاربری ، رمز عبور و نام پایگاه داده همان مواردی هستند که در مرحله اول این آموزش ایجاد کرده اید.
index.js
const express = require(‘express’);
const graphqlHTTP = require(‘express-graphql’);
const { buildSchema } = require(‘graphql’);
const { MongoClient } = require(‘mongodb’);

const context = () => MongoClient.connect(‘mongodb://username:password@localhost:27017/database_name’, { useNewUrlParser: true }).then(client => client.db(‘database_name’));

این خطوط اتصال به پایگاه داده محلی MongoDB را به تابعی به نام context اضافه می کنند. این تابع context در دسترس هر resolver خواهد بود ، به همین دلیل شما از این گزینه برای تنظیم اتصالات بانک اطلاعاتی استفاده می کنید.
در مرحله بعد ، در فایل index.js ، با وارد کردن خطوط هایلایت شده زیر ، تابع context را برای مقداردهی اولیه سرور مجازی GraphQL اضافه کنید:
index.js

const app = express();
app.use(‘/graphql’, graphqlHTTP({
schema,
rootValue: resolvers,
context
}));
app.listen(4000);

console.log(`🚀 Server ready at http://localhost:4000/graphql`);

اکنون می توانید این تابع context را از طریق resolver های خود فراخوانی کنید و از این طریق متغیرهایی را از پایگاه داده MongoDB بخوانید. اگر به مرحله اول این آموزش بازگردید ، می توانید ببینید که کدام مقادیر در پایگاه داده وجود دارد. از اینجا ، یک طرح جدید GraphQL را تعریف کنید که با این ساختار داده مطابقت دارد. مقدار قبلی را برای طرحواره ثابت با خطوط هایلایت شده زیر بازنویسی کنید:
index.js

// Construct a schema, using GrahQL schema language
const schema = buildSchema(`
type Query {
bios: [Bio]
}
type Bio {
name: Name,
title: String,
birth: String,
death: String,
awards: [Award]
}
type Name {
first: String,
last: String
},
type Award {
award: String,
year: Float,
by: String
}
`);

نوع Query تغییر کرده است و اکنون مجموعه ای از نوع جدید Bio را برمی گرداند. این نوع جدید شامل چندین نوع از جمله دو نوع غیر اسکالر دیگر name و awards است ، به این معنی که این نوع ها با یک قالب از پیش تعریف شده مانند String یا Float مطابقت ندارند. برای اطلاعات بیشتر در مورد تعریف طرح های GraphQL می توانید به مستندات مربوط به GraphQL مراجعه کنید.
همچنین ، از آنجا که resolver ها داده را از دیتابیس به شماتیک گره می زنند ، هنگام ایجاد تغییر در طرح ، کد را برای resolver ها به روز کنید. یک resolver جدید ایجاد کنید که به آن bios گفته می شود ، , برابر با Query است که می توانید در طرحواره و نام مجموعه در بانک اطلاعاتی پیدا کنید. توجه داشته باشید که در این حالت ، نام مجموعه در db.collection (“bios”) ، bios است ، اما اگر نام دیگری به مجموعه خود اختصاص داده باشید ، این نام تغییر خواهد کرد.
خط هایلایت شده زیر را به index.js اضافه کنید:
index.js

// Provide resolver functions for your schema fields
const resolvers = {
bios: (args, context) => context().then(db => db.collection(‘bios’).find().toArray())
};

این تابع از تابع context استفاده می کند ، که می توانید برای بازیابی متغیرها از پایگاه داده MongoDB استفاده کنید. پس از انجام این تغییرات در کد ، index.js را ذخیره کنید و از آن خارج شوید.
برای فعال سازی این تغییرات ، باید سرور مجازی GraphQL را مجدداً راه اندازی کنید. با استفاده از ترکیب صفحه کلید CTRL + C می توانید روند فعلی را متوقف کرده و با اجرای دستور زیر، سرور مجازی GraphQL را شروع کنید:
⦁ $ npm start

اکنون می توانید از طرحواره به روز شده استفاده کرده و داده هایی را که درون پایگاه داده است ، جستجو کنید. اگر به طرحواره نگاه کنید ، خواهید دید که Query برای bios نوع Bio را برمی گرداند. همچنین می تواند type name را برگرداند.
برای بازگرداندن تمام اسامی اول و خانوادگی برای همه bioها در پایگاه داده ، درخواست زیر را در یک پنجره ترمینال جدید به سرور مجازی GraphQL بفرستید:
⦁ curl -X POST -H “Content-Type: application/json” –data ‘{ “query”: “{ bios { name { first, last } } }” }’ http://localhost:4000/graphql

دوباره یک آبجکت JSON را که مطابق با ساختار طرح است برمی گرداند:
Output
{“data”:{“bios”:[{“name”:{“first”:”John”,”last”:”Backus”}},{“name”:{“first”:”John”,”last”:”McCarthy”}}]}}

به راحتی می توانید با گسترش پرس و جو با هر یک از انواع توصیف شده در نوع Bio ، متغیرهای بیشتری را از بایوس بازیابی کنید.
همچنین ، می توانید با مشخص کردن یک id ، bio را بازیابی کنید. برای انجام این کار باید نوع دیگری به Query اضافه کنید و resolver ها را گسترش دهید. به این منظور ، index.js را در ویرایشگر متن خود باز کنید:
⦁ $ sudo nano index.js

خطوط هایلایت شده کد را اضافه کنید:
index.js

// Construct a schema, using GrahQL schema language
const schema = buildSchema(`
type Query {
bios: [Bio]
bio(id: Int): Bio
}

// Provide resolver functions for your schema fields
const resolvers = {
bios: (args, context) => context().then(db => db.collection(‘bios’).find().toArray()),
bio: (args, context) => context().then(db => db.collection(‘bios’).findOne({ _id: args.id }))
};

فایل را ذخیره کنید و از آن خارج شوید.
در ترمینالی که سرور مجازی GraphQL شما در حال اجراست ، CTRL + C را فشار دهید تا آن را از حالت اجرا متوقف کنید، سپس دستور زیر را برای راه اندازی مجدد آن اجرا کنید:
⦁ $ npm start

در پنجره ترمینال دیگر ، درخواست GraphQL زیر را اجرا کنید:

⦁ $ curl -X POST -H “Content-Type: application/json” –data ‘{ “query”: “{ bio(id: 1) { name { first, last } } }” }’ http://localhost:4000/graphql

ورودی برای bio که دارای شناسه برابر با 1 است را برمی گرداند:
Output
{ “data”: { “bio”: { “name”: { “first”: “John”, “last”: “Backus” } } } }

توانایی جستجوی داده ها از یک پایگاه داده تنها ویژگی GraphQL نیست. همچنین می توانید داده ها را در دیتابیس تغییر دهید. برای انجام این کار ، index.js را باز کنید:
⦁ $ sudo nano index.js

در کنار نوع Query می توانید از نوع Mutation نیز استفاده کنید که به شما امکان می دهد پایگاه داده را جهش دهید. برای استفاده از این نوع ، آن را به طرح اضافه کنید و همچنین با وارد کردن این خطوط هایلایت شده ، انواع ورودی را ایجاد کنید:
index.js

// Construct a schema, using GraphQL schema language
const schema = buildSchema(`
type Query {
bios: [Bio]
bio(id: Int): Bio
}
type Mutation {
addBio(input: BioInput) : Bio
}
input BioInput {
name: NameInput
title: String
birth: String
death: String
}
input NameInput {
first: String
last: String
}

این نوع ورودی ها تعریف می کنند که کدام متغیرها می توانند به عنوان ورودی استفاده شوند ، که می توانید به آنها در resolver ها دسترسی داشته باشید و از آنها برای درج یک سند جدید در بانک اطلاعاتی استفاده کنید. این کار را با اضافه کردن سطرهای زیر به index.js انجام دهید:
index.js

// Provide resolver functions for your schema fields
const resolvers = {
bios: (args, context) => context().then(db => db.collection(‘bios’).find().toArray()),
bio: (args, context) => context().then(db => db.collection(‘bios’).findOne({ _id: args.id })),
addBio: (args, context) => context().then(db => db.collection(‘bios’).insertOne({ name: args.input.name, title: args.input.title, death: args.input.death, birth: args.input.birth})).then(response => response.ops[0])
};

درست همانطور که در مورد resolver ها برای جستارهای معمول گفته شد ، شما باید یک مقدار از resolver در index.js را برگردانید. در مورد جهش که نوع Bio در آن جهش یافته است ، مقدار bio جهش یافته را برمی گردانید.
در این مرحله ، فایل index.js شما شامل سطرهای زیر خواهد بود:
index.js
iconst express = require(‘express’);
const graphqlHTTP = require(‘express-graphql’);
const { buildSchema } = require(‘graphql’);
const { MongoClient } = require(‘mongodb’);

const context = () => MongoClient.connect(‘mongodb://username:password@localhost:27017/database_name’, { useNewUrlParser: true })
.then(client => client.db(‘GraphQL_Test’));

// Construct a schema, using GraphQL schema language
const schema = buildSchema(`
type Query {
bios: [Bio]
bio(id: Int): Bio
}
type Mutation {
addBio(input: BioInput) : Bio
}
input BioInput {
name: NameInput
title: String
birth: String
death: String
}
input NameInput {
first: String
last: String
}
type Bio {
name: Name,
title: String,
birth: String,
death: String,
awards: [Award]
}
type Name {
first: String,
last: String
},
type Award {
award: String,
year: Float,
by: String
}
`);

// Provide resolver functions for your schema fields
const resolvers = {
bios: (args, context) =>context().then(db => db.collection(‘Sample_Data’).find().toArray()),
bio: (args, context) =>context().then(db => db.collection(‘Sample_Data’).findOne({ _id: args.id })),
addBio: (args, context) => context().then(db => db.collection(‘Sample_Data’).insertOne({ name: args.input.name, title: args.input.title, death: args.input.death, birth: args.input.birth})).then(response => response.ops[0])
};

const app = express();
app.use(‘/graphql’, graphqlHTTP({
schema,
rootValue: resolvers,
context
}));
app.listen(4000);

console.log(`🚀 Server ready at http://localhost:4000/graphql`);

ذخیره کنید و از index.js خارج شوید.
برای بررسی اینکه جهش جدید شما در حال کار است ، با فشار دادن CTRL + c و اجرای npm در ترمینالی که سرور مجازی GraphQL شما را اجرا می کند ، سرور مجازی GraphQL را مجدداً راه اندازی کنید ، سپس یک بخش ترمینال دیگر را برای اجرای درخواست curl زیر باز کنید. درست مانند درخواست curl برای پرس و جو ، بدنه در پرچم –data به سرور مجازی GraphQL ارسال می شود. قسمت های هایلایت شده به دیتابیس اضافه می شود:
⦁ $ curl -X POST -H “Content-Type: application/json” –data ‘{ “query”: “mutation { addBio(input: { name: { first: \”test\”, last: \”user\” } }) { name { first, last } } }” }’ http://localhost:4000/graphql

نتیجه زیر را به همراه دارد ، بدین معنی که شما یک bio جدید را به بانک اطلاعاتی وارد کرده اید:
Output
{ “data”: { “addBio”: { “name”: { “first”: “test”, “last”: “user” } } } }

در این مرحله ارتباط خود را با MongoDB و سرور مجازی GraphQL ایجاد کردید و با اجرای پرس و جوهای GraphQL می توانید داده ها را از این پایگاه داده بازیابی کنید و جهش دهید. در مرحله بعد ، این سرور مجازی GraphQL را برای دسترسی از راه دور قرار می دهید.
مرحله 4 – اجازه دسترسی از راه دور
با راه اندازی بانک اطلاعاتی و سرور مجازی GraphQL ، اکنون می توانید سرور مجازی GraphQL را پیکربندی کنید تا امکان دسترسی از راه دور فراهم شود. برای این کار از Nginx استفاده می کنید ، که در آموزش پیش نیاز نحوه نصب Nginx در اوبونتو 18.04 این کار را انجام دادید. این پیکربندی Nginx را می توان در فایل /etc/nginx/sites-available/example.com یافت ، جایی که example.com نام سرور مجازی ی است که در آموزش پیش نیاز اضافه کردید.
این فایل را برای ویرایش باز کنید و نام دامنه خود را در example.com جایگزین کنید:
⦁ $ sudo nano /etc/nginx/sites-available/example.com

در این فایل می توانید یک بلوک سرور مجازی پیدا کنید که به پورت 80 گوش می دهد ، جایی که در حال حاضر مقداری برای server_name در آموزش پیش نیاز تنظیم کرده اید. در داخل این بلوک سرور مجازی ، مقدار root را تغییر دهید تا دایرکتوری باشد که در آن کد را برای سرور مجازی GraphQL ایجاد کرده و index.js را به عنوان فهرست اضافه می کنید. همچنین ، در بلوک لوکیشن ، یک proxy_pass تنظیم کنید تا بتوانید از IP سرور مجازی یا نام دامنه دلخواه خود برای مراجعه به سرور مجازی GraphQL استفاده کنید:
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;

root /project_name;
index index.js;

server_name example.com;

location / {
proxy_pass http://localhost:4000/graphql;
}
}

با اجرای دستور زیر مطمئن شوید که هیچ خطای نحوی Nginx در این فایل پیکربندی وجود ندارد:
⦁ $ sudo nginx -t

خروجی زیر را دریافت خواهید کرد:
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

هنگامی که هیچ خطایی برای فایل پیکربندی یافت نشد ، Nginx را مجدداً راه اندازی کنید:
⦁ $ sudo systemctl restart nginx

اکنون می توانید با اجرا و جایگزین کردن example.com توسط IP سرور مجازی یا نام دامنه شخصی خود به سرور مجازی GraphQL خود از هر تب بخش ترمینال دسترسی داشته باشید:
⦁ $ curl -X POST -H “Content-Type: application/json” –data ‘{ “query”: “{ bios { name { first, last } } }” }’ http://example.com

همان آبجکت JSON به شیوه مرحله قبلی را برمی گرداند که شامل هر داده اضافی است که ممکن است با استفاده از یک جهش ، اضافه کرده باشید.
Output
{“data”:{“bios”:[{“name”:{“first”:”John”,”last”:”Backus”}},{“name”:{“first”:”John”,”last”:”McCarthy”}},{“name”:{“first”:”test”,”last”:”user”}}]}}

اکنون که سرور مجازی GraphQL را از راه دور در دسترس قرار داده اید ، هنگام بستن ترمینال یا راه اندازی مجدد سرور مجازی ، مطمئن شوید که سرور مجازی GraphQL شما متوقف نمیشود. به این ترتیب ، هر زمان که بخواهید درخواست کنید ، پایگاه داده MongoDB شما از طریق سرور مجازی GraphQL قابل دسترسی خواهد بود.
برای انجام این کار ، از بسته npm forever استفاده کنید ، یک ابزار CLI که تضمین می کند اسکریپت های خط فرمان شما به طور مداوم اجرا میشوند یا در صورت بروز هرگونه خرابی مجدداً راه اندازی می شوند.
Forever را با npm نصب کنید:
⦁ $ sudo npm install forever -g

پس از انجام کار نصب ، آن را به فایل pack.json اضافه کنید:
package.json
{
“name”: “project_name”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“start”: “node index.js”,
“deploy”: “forever start –minUptime 2000 –spinSleepTime 5 index.js”,
“test”: “echo \”Error: no test specified\” && exit 1″
},

برای راه اندازی سرور مجازی GraphQL با forever فعال ، دستور زیر را اجرا کنید:
⦁ $ npm run deploy

با این کار فایل index.js حاوی سرور مجازی GraphQL با forever شروع می شود و اطمینان حاصل می کند که در صورت عدم موفقیت ، با حداقل زمان اجرای 2000 میلی ثانیه و 5 میلی ثانیه در هر راه اندازی مجدد کار خود را ادامه می دهید. سرور مجازی GraphQL اکنون به طور مداوم در پس زمینه اجرا می شود ، بنابراین دیگر وقتی می خواهید یک درخواست به سرور مجازی ارسال کنید ، دیگر نیازی به باز کردن تب جدید ندارید.
اکنون یک سرور مجازی GraphQL ایجاد کرده اید که از MongoDB برای ذخیره داده استفاده می کند و برای دسترسی به سرور مجازی از راه دور تنظیم شده است. در مرحله بعدی می توانید playground را درGraphiQL را فعال کنید ، که این امکان را برای شما فراهم می کند که سرور مجازی GraphQL را بازرسی کنید.
مرحله 5 – فعال کردن playground GraphiQL
توانایی ارسال درخواستهای cURL به سرور مجازی GraphQL بسیار عالی است ، اما با داشتن یک رابط کاربری که بتواند بلافاصله درخواستهای GraphQL را اجرا کند ، به خصوص هنگام توسعه ، سریعتر خواهد بود. برای این کار می توانید از GraphiQL ، واسط پشتیبانی شده توسط بسته express-Graphql استفاده کنید.
برای فعال کردن GraphiQL ، فایل index.js را ویرایش کنید:
⦁ $ sudo nano index.js

خطوط هایلایت شده زیر را اضافه کنید:
index.js
const app = express();
app.use(‘/graphql’, graphqlHTTP({
schema,
rootValue: resolvers,
context,
graphiql: true
}));
app.listen(4000);

console.log(`🚀 Server ready at http://localhost:4000/graphql`);

فایل را ذخیره کنید و از آن خارج شوید.
برای اینکه این تغییرات قابل مشاهده باشند ، با اجرای دستور زیر forever را متوقف شوید:
⦁ $ forever stop index.js

سپس ، دوباره forever را شروع کنید تا آخرین نسخه سرور مجازی QL در حال اجرا را ببینید
⦁ $ npm run deploy

یک مرورگر به آدرس http://example.com باز کنید ، و جایگزین example.com را با نام دامنه یا IP سرور مجازی خود جایگزین کنید. playground GraphiQL را خواهید دید که در آن می توانید درخواست های GraphQL را تایپ کنید.

در سمت چپ این playground می توانید پرس و جوهای GraphQL و جهش ها را تایپ کنید ، در حالی که خروجی در سمت راست playground نشان داده خواهد شد. برای آزمایش اینکه آیا کار می کند ، عبارت زیر را در سمت چپ تایپ کنید:
query {
bios {
name {
first
last
}
}
}

نتیجه مشابه در سمت راست playground ، دوباره با فرمت JSON را نشان میدهد:

اکنون می توانید درخواست های GraphQL را با استفاده از ترمینال و playground GraphiQL ارسال کنید.
نتیجه
در این آموزش پایگاه داده MongoDB را تنظیم کرده و داده ها را از این پایگاه داده با استفاده از GraphQL ، Node.js و Express برای سرور مجازی بازیابی می کنید و جهش میدهید. علاوه بر این ، Nginx را پیکربندی کردید تا امکان دسترسی از راه دور به این سرور مجازی را فراهم کند. نه تنها می توانید درخواست ها را به طور مستقیم به این سرور مجازی GraphQL ارسال کنید ، بلکه می توانید از GraphiQL به عنوان یک رابط GraphQL در مرورگر GraphQL نیز استفاده کنید.
اگر می خواهید در مورد GraphQL اطلاعات کسب کنید ، می توانید فیلم ضبط شده از ارائه من در GraphQL را در NDC {London watch} مشاهده کنید یا برای آموزش در مورد GraphQL به وب سایت howtographql.com مراجعه کنید. برای مطالعه چگونگی تعامل GraphQL با سایر فناوری ها ، به آموزش نحوه تنطیم دستی سرور مجازی Prisma در اوبونتو 18.04 نگاهی بیاندازید، و برای کسب اطلاعات بیشتر در مورد ساخت برنامه های کاربردی با MongoDB ، به نحوه ایجاد بلاگ با Nest.js ، MongoDB و Vue.js مراجعه کنید.

 

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

پارامترهای پیش فرض در جاوا اسکریپت  –  اجرای چندین نسخه PHP بر روی یک سرور Debian 10

نحوه راه اندازی یک پروژه React با برنامه Reactنصب و ایمن سازی phpMyAdmin در اوبونتو 18

پیکربندی یک تایید اعتبار مجاز(CA) در CentOS 8  –  تنظیم برنامه Node.js برای تولید در CentOS 7

نصب MariaDB در اوبونتو 18.04  –  ایمن کردن Apache با Let’s Encrypt در Debian 10

نحوه نصب Node.js در CentOS 8  –  بازنویسی URL را با mod_rewrite برای Apache در Debian 10

راه اندازی فایروال با استفاده از firewalld در CentOS 8  –  نصب وب سرور Apache در Debian 10

اضافه کردن و حذف کاربران در CentOS 8 –  نصب Apache Tomcat 9 در Debian 10

نصب و استفاده از PostgreSQL در CentOS 8  –  راه اندازی سرور اولیه با Debian 10

نصب MariaDB در CentOS 8  –  چگونه با JSX عناصر واقعی ایجاد کنیم

نصب و پیکربندی VNC در Debian 10  –  استفاده از سرور از راه دور Docker

نصب و ایمن سازی Grafana در اوبونتو 18  –  نحوه نصب Git در CentOS 8

نصب Git در Debian 10 –  نصب و پیکربندی Zabbix برای ردیابی ایمن سرورهای

نحوه نصب Node.js در Debian 10  –  نصب وب سرور Apache در CentOS 7

نحوه نصب Webmin در Debian 10  –  نصب و پیکربندی Zabbix برای ردیابی ایمن سرور

نصب وردپرس با بانک اطلاعاتی در اوبونتو  – ساخت و استقرار سرور GraphQL با Node.js و MongoDB

نصب پایتون 3 و تنظیم نویسی محلی macOS  – نصب و ایمن سازی phpMyAdmin با Nginx در سرور

نصب Nagios 4 و نظارت بر سرور اوبونتو 18  –  نصب Python 3 و تنظیم یک محیط برنامه نویسی

نحوه نصب R بر روی Debian 10  –  راه اندازی سرور Prisma روی اوبونتو 18.04

نصب و پیکربندی Laravel با LEMP در اوبونتو 18  –  نصب و پیکربندی pgAdmin 4 در Server Mode

نصب Python 3 و تنظیم برنامه نویسی CentOS 8نصب Jitsi Meet در Ubuntu 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکاخرید سرور مجازی ارزان هلندvpsخرید vps هلندخرید سرور مجازی آمریکاخرید vps فرانسهتست vpsسرور مجازی تستسرور مجازی ویندوزارزانترین vpsخرید وی پی اسvps ارزان – 


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/