Как собрать и развернуть сервер GraphQL с Node.js и MongoDB в Ubuntu 18.04

_ Автор выбрал Wikimedia Foundation, чтобы получить пожертвование в рамках программы Write for DOnations ._

Вступление

GraphQL был публично выпущен Facebook в 2015 году как язык запросов для API, который позволяет легко запрашивать и изменять данные из разных коллекций данных. С одной конечной точки вы можете запрашивать и изменять несколько источников данных с помощью одного запроса POST. GraphQL устраняет некоторые распространенные недостатки проектирования в архитектурах API REST, например, ситуации, когда конечная точка возвращает больше информации, чем вам действительно нужно. Кроме того, при использовании API REST вам может потребоваться отправить запросы нескольким конечным точкам REST, чтобы собрать всю необходимую вам информацию - ситуация, которая называется проблемой n + 1. Примером этого может служить ситуация, когда вы хотите показать информацию о пользователях, но вам необходимо собрать такие данные, как личные данные и адреса с разных конечных точек.

Эти проблемы не относятся к GraphQL, поскольку он имеет только одну конечную точку, которая может возвращать данные из нескольких коллекций. Данные, которые он возвращает, зависят от query, который вы отправляете в эту конечную точку. В этом запросе вы определяете структуру данных, которые вы хотите получить, включая любые вложенные коллекции данных. В дополнение к запросу вы также можете использовать mutation для изменения данных на сервере GraphQL и subscription для отслеживания изменений в данных. Для получения дополнительной информации о GraphQL и его концепциях вы можете посетить documentation на официальном сайте.

Поскольку GraphQL является языком запросов с большой гибкостью, он особенно хорошо сочетается с базами данных на основе документов, такими как MongoDB. Обе технологии основаны на иерархических типизированных схемах и популярны в сообществе JavaScript. Кроме того, данные MongoDB хранятся в виде объектов JSON, поэтому дополнительный анализ на сервере GraphQL не требуется.

В этом руководстве вы создадите и развернете сервер GraphQL с Node.js, который может запрашивать и изменять данные из базы данных MongoDB, работающей в Ubuntu 18.04. В конце этого руководства вы сможете получить доступ к данным в своей базе данных, используя одну конечную точку, отправляя запросы на сервер напрямую через терминал и используя готовый интерфейс GraphiQL для игровых площадок. На этой игровой площадке вы можете исследовать содержимое сервера GraphQL, отправляя запросы, изменения и подписки. Кроме того, вы можете найти визуальные представления схем, которые определены для этого сервера.

В конце этого руководства вы будете использовать площадку GraphiQL для быстрого взаимодействия с вашим сервером GraphQL:

image: https: //assets.digitalocean.com/articles/cart_64864/GraphiQL_1.png [Площадка GraphiQL в действии]

Предпосылки

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

Шаг 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)
   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

Перед созданием базы данных, в которой вы будете хранить примеры данных, вам необходимо сначала создать пользователя * admin *, поскольку обычные пользователи имеют доступ к определенной базе данных. Вы можете сделать это, выполнив следующую команду, которая открывает оболочку MongoDB:

mongo

С оболочкой MongoDB вы получите прямой доступ к базе данных MongoDB и сможете создавать пользователей или базы данных и запрашивать данные. Внутри этой оболочки выполните следующую команду, которая добавит нового пользователя * admin * в MongoDB. Вы можете заменить выделенные ключевые слова своей комбинацией имени пользователя и пароля, но не забудьте их где-нибудь записать.

use admin
db.createUser({
   user: "",
   pwd: "",
   roles: [{ role: "root", db: "admin"}]
})

Первая строка предыдущей команды выбирает базу данных с именем + admin +, которая является базой данных, в которой хранятся все роли администратора. С помощью метода + db.createUser () + вы можете создать реального пользователя и определить его имя пользователя, пароль и роли.

Выполнение этой команды вернет:

OutputSuccessfully added user: {
   "user" : "",
   "roles" : [
       {
           "role" : "root",
           "db" : "admin"
       }
   ]
}

Теперь вы можете закрыть оболочку MongoDB, набрав + exit +.

Затем снова войдите в оболочку MongoDB, но на этот раз с вновь созданным пользователем * admin *:

mongo -u "" -p "" --authenticationDatabase "admin"

Эта команда откроет оболочку MongoDB как определенный пользователь, где флаг + -u + указывает имя пользователя, а + -p + помечает пароль этого пользователя. Дополнительный флаг + - authenticationDatabase + указывает, что вы хотите войти в систему как * admin *.

Затем вы переключитесь на новую базу данных и затем используете метод + db.createUser () +, чтобы создать нового пользователя с разрешениями для внесения изменений в эту базу данных. Замените выделенные разделы своей собственной информацией, обязательно записав эти учетные данные.

Выполните следующую команду в оболочке MongoDB:

use
db.createUser({
   user: "",
   pwd: "",
   roles: ["readWrite"]
})

Это вернет следующее:

OutputSuccessfully added user: { "user" : "", "roles" : ["readWrite"] }

После создания базы данных и пользователя заполните эту базу данных примерами, которые могут быть запрошены сервером GraphQL позже в этом руководстве. Для этого вы можете использовать образец bios collection с веб-сайта MongoDB. Выполнив команды в следующем фрагменте кода, вы вставите уменьшенную версию этого набора данных + bios + 'в вашу базу данных. Вы можете заменить выделенные разделы своей собственной информацией, но для целей данного руководства назовите коллекцию `++:

db..insertMany([
  {
      "_id" : 1,
      "name" : {
          "first" : "John",
          "last" : "Backus"
      },
      "birth" : ISODate("1924-12-03T05:00:00Z"),
      "death" : ISODate("2007-03-17T04:00:00Z"),
      "contribs" : [
          "Fortran",
          "ALGOL",
          "Backus-Naur Form",
          "FP"
      ],
      "awards" : [
          {
              "award" : "W.W. McDowell Award",
              "year" : 1967,
              "by" : "IEEE Computer Society"
          },
          {
              "award" : "National Medal of Science",
              "year" : 1975,
              "by" : "National Science Foundation"
          },
          {
              "award" : "Turing Award",
              "year" : 1977,
              "by" : "ACM"
          },
          {
              "award" : "Draper Prize",
              "year" : 1993,
              "by" : "National Academy of Engineering"
          }
      ]
  },
  {
      "_id" : ObjectId("51df07b094c6acd67e492f41"),
      "name" : {
          "first" : "John",
          "last" : "McCarthy"
      },
      "birth" : ISODate("1927-09-04T04:00:00Z"),
      "death" : ISODate("2011-12-24T05:00:00Z"),
      "contribs" : [
          "Lisp",
          "Artificial Intelligence",
          "ALGOL"
      ],
      "awards" : [
          {
              "award" : "Turing Award",
              "year" : 1971,
              "by" : "ACM"
          },
          {
              "award" : "Kyoto Prize",
              "year" : 1988,
              "by" : "Inamori Foundation"
          },
          {
              "award" : "National Medal of Science",
              "year" : 1990,
              "by" : "National Science Foundation"
          }
      ]
  }
]);

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

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

...

Чтобы сделать эти изменения активными, перезапустите 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)
   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 "" -p "" --authenticationDatabase ""

При этом используются те же флаги, что и раньше, только на этот раз + - authenticationDatabase + устанавливается в базу данных, которую вы создали, и заполняет данные примера.

Теперь вы успешно добавили пользователя * admin * и другого пользователя, который имеет доступ на чтение / запись к базе данных с примерами данных. Кроме того, в базе данных включена авторизация, а это значит, что вам нужно имя пользователя и пароль для доступа к ней. На следующем шаге вы создадите сервер GraphQL, который будет подключен к этой базе данных позже в руководстве.

Шаг 2 - Создание сервера GraphQL

С базой данных, настроенной и заполненной примерами данных, пришло время создать сервер GraphQL, который может запрашивать и изменять эти данные. Для этого вы будете использовать Express и https://graphql.org/graphql-js/express-graphql/ [+ express-graphql +], которые оба запустить на Node.js. 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

Чтобы инициализировать новый проект JavaScript, выполните следующие команды на сервере как пользователь + sudo + и замените выделенные ключевые слова именем вашего проекта.

Сначала перейдите в корневой каталог вашего сервера:

cd

Оказавшись там, создайте новый каталог с именем вашего проекта:

mkdir

Переместить в этот каталог:

cd

Наконец, инициализируйте новый пакет npm с помощью следующей команды:

sudo npm init -y

После запуска + npm init -y + вы получите сообщение об успешном завершении создания следующего файла + package.json +:

OutputWrote to /home///package.json:

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

Теперь, когда вы инициализировали проект, установите пакеты, необходимые для настройки сервера 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`);

Этот блок кода состоит из нескольких важных частей. Сначала вы описываете схему данных, возвращаемых API GraphQL:

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!'
};
...

Эти средства распознавания напрямую связаны со схемами и возвращают данные, соответствующие этим схемам.

Последняя часть этого блока кода инициализирует сервер 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. Это можно сделать вручную из командной строки, но обычно для этого нужно настроить файл + package.json +.

Откройте файл + package.json:

sudo nano package.json

Добавьте следующую выделенную строку в этот файл:

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"
}

Сохраните и выйдите из файла.

Чтобы запустить сервер GraphQL, выполните в терминале следующую команду:

npm start

Как только вы запустите это, запрос терминала исчезнет, ​​и появится сообщение, подтверждающее работу сервера GraphQL:

Output🚀 Server ready at http://localhost:4000/graphql

Если вы сейчас откроете другой сеанс терминала, вы можете проверить, работает ли сервер GraphQL, выполнив следующую команду. Это отправляет запрос + curl` + POST` с телом JSON после флага + - data +, который содержит ваш запрос GraphQL, в локальную конечную точку:

curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ hello }" }' http://localhost:4000/graphql

Это выполнит запрос, как описано в схеме GraphQL в вашем коде, и вернет данные в предсказуемом формате JSON, который соответствует данным, полученным в резольверах:

Output{ "data": { "hello": "Hello world!" } }

На этом шаге вы создали первую версию сервера GraphQL, которая теперь работает на локальной конечной точке, к которой можно получить доступ на вашем сервере. Затем вы подключите ваши средства распознавания к базе данных MongoDB.

Шаг 3 - Подключение к базе данных MongoDB

Имея сервер GraphQL в порядке, вы можете теперь установить соединение с базой данных MongoDB, которую вы предварительно настроили и заполнили данными, и создать новую схему, соответствующую этим данным.

Чтобы иметь возможность подключиться к MongoDB с сервера GraphQL, установите пакет JavaScript для MongoDB из npm:

sudo npm install --save mongodb

После того, как это будет установлено, откройте + index.js в вашем текстовом редакторе:

sudo nano index.js

Затем добавьте следующий выделенный код в + index.js + сразу после импортированных зависимостей и заполните выделенные значения своими собственными сведениями о соединении в локальной базе данных MongoDB. + Username +, + password _ и` + database_name _` - это те, которые вы создали на первом шаге этого урока.

index.js

const express = require('express');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');



...

Эти строки добавляют соединение с локальной базой данных MongoDB к функции под названием context. Эта контекстная функция будет доступна для каждого распознавателя, поэтому вы используете ее для настройки соединений с базой данных.

Затем, в вашем файле + index.js, добавьте функцию контекста к инициализации сервера 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`);

Теперь вы можете вызывать эту контекстную функцию из ваших преобразователей и, таким образом, читать переменные из базы данных MongoDB. Если вы вернетесь к первому шагу этого руководства, вы увидите, какие значения присутствуют в базе данных. Отсюда определите новую схему GraphQL, которая соответствует этой структуре данных. Замените предыдущее значение для константы + схема + следующими выделенными строками:

index.js

...
// Construct a schema, using GrahQL schema language





















...

Тип + Query + изменился и теперь возвращает коллекцию нового типа + Bio +. Этот новый тип состоит из нескольких типов, включая два других нескалярных типа + Name + и + Awards +, что означает, что эти типы не соответствуют предопределенному формату, например + String + или + Float +. Для получения дополнительной информации об определении схем GraphQL вы можете посмотреть documentation для GraphQL.

Кроме того, поскольку средства сопоставления связывают данные из базы данных со схемой, обновляйте код для средств сопоставления при внесении изменений в схему. Создайте новый распознаватель, который называется + bios +, который равен + Query, который можно найти в схеме, и имя коллекции в базе данных. Обратите внимание, что в этом случае имя коллекции в + db.collection ('bios') + равно + bios +, но это изменится, если вы присвоите своей коллекции другое имя.

Добавьте следующую выделенную строку в + index.js:

index.js

...
// Provide resolver functions for your schema fields
const resolvers = {

};
...

Эта функция будет использовать контекстную функцию, которую вы можете использовать для извлечения переменных из базы данных MongoDB. После внесения этих изменений в код сохраните и выйдите из + index.js.

Чтобы эти изменения были активными, вам нужно перезапустить сервер GraphQL. Вы можете остановить текущий процесс, используя комбинацию клавиш + CTRL + + + C + и запустить сервер GraphQL, выполнив:

npm start

Теперь вы можете использовать обновленную схему и запрашивать данные, которые находятся в базе данных. Если вы посмотрите на схему, вы увидите, что + Query для` + bios` возвращает тип + Bio +; этот тип также может возвращать тип + Name +.

Чтобы вернуть все имена и фамилии для всех биосов в базе данных, отправьте следующий запрос на сервер 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"}}]}}

Вы можете легко получить больше переменных из BIOS, расширив запрос любым из типов, которые описаны в типе для + Bio +.

Также вы можете получить биографию, указав + id +. Чтобы сделать это, вам нужно добавить другой тип к типу + Query и расширить распознаватели. Для этого откройте + index.js в вашем текстовом редакторе:

sudo nano index.js

Добавьте следующие выделенные строки кода:

index.js

...
// Construct a schema, using GrahQL schema language
const schema = buildSchema(`
 type Query {
   bios: [Bio]

 }

 ...

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

 };
 ...

Сохраните и выйдите из файла.

В терминале, на котором запущен ваш сервер 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

Это возвращает запись для био, которое имеет + id +, равное + 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
 }













...

Эти типы ввода определяют, какие переменные можно использовать в качестве входных данных, к которым вы можете обращаться в средствах разрешения и использовать для вставки нового документа в базу данных. Сделайте это, добавив следующие строки в + 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 }))

};
...

Как и в случае с резольверами для обычных запросов, вам необходимо вернуть значение из резольвера в + index.js +. В случае + Mutation +, где тип + 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://:@localhost:27017/', { 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.

Чтобы проверить, работает ли ваша новая мутация, перезапустите сервер GraphQL, нажав + CTRL + + + c + и запустив + npm start + в терминале, на котором работает сервер GraphQL, затем откройте другой сеанс терминала, чтобы выполнить следующее + curl + запрос. Как и в случае запроса + curl, тело в флаге` + - data + `будет отправлено на сервер GraphQL. Выделенные части будут добавлены в базу данных:

curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation { addBio(input: { name: { first: \"\", last: \"\" } }) { name { first, last } } }" }' http://localhost:4000/graphql

Это возвращает следующий результат, то есть вы только что добавили новую биографию в базу данных:

Output{ "data": { "addBio": { "name": { "first": "", "last": "" } } } }

На этом этапе вы создали соединение с MongoDB и сервером GraphQL, что позволяет извлекать и изменять данные из этой базы данных, выполняя запросы GraphQL. Далее вы предоставите этот сервер GraphQL для удаленного доступа.

Шаг 4 - Разрешение удаленного доступа

Настроив базу данных и сервер GraphQL, вы теперь можете настроить сервер GraphQL для разрешения удаленного доступа. Для этого вы будете использовать Nginx, который вы установили в обязательном учебном пособии How to установить Nginx на Ubuntu 18.04. Эту конфигурацию Nginx можно найти в файле + / etc / nginx / sites-available / +, где + example.com + - это имя сервера, которое вы добавили в учебнике по предварительным требованиям.

Откройте этот файл для редактирования, заменив ваше доменное имя на ++:

sudo nano /etc/nginx/sites-available/

В этом файле вы можете найти блок сервера, который прослушивает порт + 80 +, где вы уже установили значение для + server_name + в обязательном учебном пособии. Внутри этого блока сервера измените значение + root + на каталог, в котором вы создали код для сервера GraphQL, и добавьте + index.js + в качестве индекса. Кроме того, в блоке location установите + proxy_pass +, чтобы вы могли использовать IP-адрес вашего сервера или имя собственного домена для обращения к серверу GraphQL:

/etc/nginx/sites-available/example.com

server {
 listen 80;
 listen [::]:80;

 ;
 ;

 server_name ;

 location / {

 }
}

Убедитесь, что в этом файле конфигурации нет синтаксических ошибок Nginx, выполнив:

sudo nginx -t

Вы получите следующий вывод:

Outputnginx: 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

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

curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ bios { name { first, last } } }" }' http://

Это вернет тот же объект JSON, что и на предыдущем шаге, включая любые дополнительные данные, которые вы могли бы добавить, используя мутацию:

Output{"data":{"bios":[{"name":{"first":"John","last":"Backus"}},{"name":{"first":"John","last":"McCarthy"}},{"name":{"first":"test","last":"user"}}]}}

Теперь, когда вы сделали сервер GraphQL доступным удаленно, убедитесь, что ваш сервер GraphQL не выходит из строя при закрытии терминала или перезапуске сервера. Таким образом, ваша база данных MongoDB будет доступна через сервер GraphQL всякий раз, когда вы захотите сделать запрос.

Для этого используйте пакет npm https://www.npmjs.com/package/forever [+ forever +], инструмент CLI, который обеспечивает непрерывную работу сценариев командной строки или перезапуск в случае любого сбоя.

Установите + forever + с помощью npm:

sudo npm install forever -g

После завершения установки добавьте его в файл + 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"
 },
 ...

Чтобы запустить сервер GraphQL с включенным + forever +, выполните следующую команду:

npm run deploy

Это запустит файл + index.js +, содержащий сервер GraphQL с + forever +, и обеспечит его работу с минимальным временем безотказной работы 2000 миллисекунд и 5 миллисекундами между каждым перезапуском в случае сбоя. Сервер GraphQL теперь будет непрерывно работать в фоновом режиме, поэтому вам больше не нужно открывать новую вкладку, когда вы хотите отправить запрос на сервер.

Вы создали сервер GraphQL, который использует MongoDB для хранения данных и настроен на разрешение доступа с удаленного сервера. На следующем шаге вы включите игровую площадку GraphiQL, которая облегчит вам осмотр сервера GraphQL.

Шаг 5 - Включение GraphiQL Playground

Возможность отправлять запросы cURL на сервер GraphQL - это здорово, но было бы быстрее иметь пользовательский интерфейс, который мог бы выполнять запросы GraphQL немедленно, особенно во время разработки. Для этого вы можете использовать GraphiQL, интерфейс, поддерживаемый пакетом + express-graphql +.

Чтобы включить GraphQL, отредактируйте файл + index.js:

sudo nano index.js

Добавьте следующие выделенные строки:

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`);

Сохраните и выйдите из файла.

Чтобы эти изменения стали видимыми, обязательно остановите + forever +, выполнив:

forever stop index.js

Затем снова запустите + forever +, чтобы была запущена последняя версия вашего сервера GraphQL:

npm run deploy

Откройте браузер по URL-адресу + http: // +, заменив ++ именем вашего домена или IP-адресом вашего сервера. Вы увидите игровую площадку GraphiQL, где можно вводить запросы GraphQL.

image: https: //assets.digitalocean.com/articles/cart_64864/GraphiQL_2.png [Начальный экран для площадки GraphiQL]

В левой части этой площадки вы можете вводить запросы и мутации в GraphQL, а вывод будет показан справа от площадки. Чтобы проверить, работает ли это, введите следующий запрос слева:

query {
 bios {
   name {
     first
     last
   }
 }
}

Это выведет тот же результат на правой стороне игровой площадки, снова в формате JSON:

image: https: //assets.digitalocean.com/articles/cart_64864/GraphiQL_3.png [Площадка GraphiQL в действии]

Теперь вы можете отправлять запросы GraphQL с помощью терминала и игровой площадки GraphiQL.

Заключение

В этом руководстве вы настроили базу данных MongoDB и извлекли и изменили данные из этой базы данных, используя GraphQL, Node.js и Express для сервера. Кроме того, вы настроили Nginx для разрешения удаленного доступа к этому серверу. Вы можете не только отправлять запросы непосредственно на этот сервер GraphQL, вы также можете использовать GraphiQL в качестве визуального интерфейса GraphQL в браузере.

Если вы хотите узнать о GraphQL, вы можете посмотреть recording мою презентацию на GraphQL по адресу NDC \ { Лондон} или посетите веб-сайт https://howtographql.com [howtographql.com] для ознакомления с учебниками по GraphQL. Чтобы узнать, как GraphQL взаимодействует с другими технологиями, ознакомьтесь с руководством на https://www.digitalocean.com/community/tutorials/how-to-manually-set-up-a-prisma-server-on-ubuntu-18- 04 [Как вручную настроить сервер Prisma в Ubuntu 18.04], а также для получения дополнительной информации о создании приложений с MongoDB см. Https://www.digitalocean.com/community/tutorials/how-to-build-a-blog-. with-nest-js-mongodb-and-vue-js [Как создать блог с помощью Nest.js, MongoDB и Vue.js].

Related