Серверная разработка для автосалона

Учебник направлен на то, чтобы помочь любому, у кого есть некоторый технический опыт, создавать API-интерфейсы RESTful Server в Nodejs.

Вы сказали, что такое ОТДЫХ?

Передача репрезентативного состояния (REST) или RESTful веб-сервисы - это способ обеспечения взаимодействия между компьютерными системами в Интернете. REST-совместимые веб-службы позволяют запрашивающим системам получать доступ и управлять текстовыми представлениями веб-ресурсов с помощью унифицированного и предопределенного набора операций без сохранения состояния.

Это полный рот. Читайте больше здесь или учитесь прямо сейчас!

В конце этого руководства вы настроите внутренний интерфейс для автосалона, который позволяет клиентам размещать заказы и передавать их поставщику.

Если вам нужна помощь, финальный проект можно найти здесь: https://github.com/rajansawhney/CCAS

Хорошо, приступим!

Позвольте нам называть себя Central Cascade Automative Sales или сокращенно CCAS.

Что мы делаем?

Что ж, мы являемся посредником или связующим звеном, если хотите, для производителей автомобилей и клиентов. Мы позволяем клиентам размещать заказы и информируем поставщиков (поставщиков == производителей автомобилей) о том, чего хотят клиенты. Поставщик подтверждает размещение заказа, возвращая обратно идентификатор заказа, который мы передаем клиенту в качестве ссылочного номера для заказа.

Давайте продолжим.

Вот подробный рабочий процесс проекта

1. Customer provides {customer_id, make, model, package} as request to Central Cascade Automotive Sales(CCAS).
CCAS maintains Customer Schema as described below.

2. CCAS validates customer_id against stored customer information.
If the customer_id is invalid -> stop request.
If the customer's mentioned Shipping address in not in USA -> stop request. We only cater to USA as of now..we're growing though

3.If the customer_id and make are valid, do the following depending on the “make”

If make is “Acme Autos” or "ACME"
- Send request to the Acme API with {api_key, model, package}
- Only a valid api_key guarantees response from the Acme API
- Acme sends back {order_id} as response

If make is “Rainier” or "Rainier Transportation Solution" or "RTS"
- Send token request to the RTS API with {storefront}
- RTS responds with {nonce_token}
- CCAS posts request to RTS with {nonce_token, model, package}
- RTS replies back with {order_id} as response if nonce_token is valid

4. Store order details for internal use:
{order_id, customer_id, supplier_id, make, model, package}
- Supplier_id helps identify supplier. order_id and customer_id cannot uniquely identify the supplier. Eg: Both Acme and Rainier could have the same order_id
- Make is unique in our case, but by convention it is better to use IDs than strings.

5. Inform customer of successful request and provide json object link for that order_id

Модель базы данных

1. Заказчик

{ customerId, name.firstName, name.LastName, address.city, address.state, address.country }

2. Заказы

{ orderId, customerIid, supplierIid, make, model, package}

ПРИМЕЧАНИЕ: здесь orderId представляет собой orderId, возвращаемый API поставщика при успешном размещении заказа.

3. Поставщик

{ supplierId, make, api_key, storefront, token }

Все схемы поддерживают операции GET, POST, PUT и DELETE

Начиная

Предварительные требования:

  1. Node.js. Обратитесь за помощью к документации.
  2. НПМ. Обратитесь к документации
  3. MongoDB. Обратитесь к мануалу
  4. Текстовый редактор. : vim, возвышенное, атом и т. д.

Создайте папку / CCAS. Это будет наша корневая папка

Когда у вас есть указанные выше предварительные требования, запустите npm init, чтобы получить node_modules и package.json.

Пакеты:

Нам нужно несколько пакетов для нашего проекта

Nodemon

npm install --save nodemon

Мангуст

npm install --save mongoose

Экспресс

npm install --save express

Лодаш

npm install --save lodash

Axios

npm install --save axios

И еще несколько пакетов для тестирования. Да, мы проведем небольшое тестирование. Это необходимое зло.

После установки всех пакетов package.json в корневом каталоге должен выглядеть примерно так (добавьте их скрипты):

Сделайте четыре папки:
1. серверы
2. модели
3. контроллеры
4. маршруты

Ваша структура папок должна выглядеть так:

Хорошо, давайте начнем кодить по-настоящему.

Кодирование нашего сервера

Мы начнем с написания сервера для CCAS, чтобы у нас был адрес для отправки запросов.

Перейдите в / servers, откройте ccasServer.js и введите следующее:

Теперь в корневом каталоге запустите: npm run ccas

..это запускает ccasServer!

Эй, эй! Наш сервер запущен! Вот увидишь:

CCAS server started on: 3000

Настройка схемы клиента

Хорошо, у нас есть сервер, который принимает запросы на порт: 3000.

Давайте создадим нашу схему клиентов и введем их в нашу базу данных MongoDB.

Мы будем использовать Mongoose для взаимодействия с экземпляром MongoDB.

Перейдите в папку / models, откройте customerModel.js и введите это (пояснение кода приведено ниже:

Сохраните это, и у нас есть схема наших клиентов.

До сих пор мы создали схему под названием CustomerSchema, используя мангуст, с двумя основными компонентами:
1. name
- firstName (обязательно)
- lastName ( обязательно)
2. адрес
- улица (необязательно)
- штат (необязательно)
- страна (обязательно)

Мы определили CustomerSchema. И эта строчка ..

module.exports = mongoose.model('Customer', CustomerSchema);

..позволяет нам экспортировать модель под названием «Клиент», которую можно импортировать в другую программу. Аккуратный!

Настройка маршрутов

Здесь мы обрабатываем функции REST и устанавливаем конечные точки.

Маршрутизация относится к определению того, как приложение отвечает на запрос клиента для конкретной конечной точки, которая является URI (или путем) и конкретным методом HTTP-запроса (GET, POST и т. Д.).

Функции REST: GET (чтение), POST (создание), PUT (обновление) и DELETE (удаление). HTTP-версия CRUD

Думайте о маршрутах как о канале, который соединяет функции REST с функциями, которые соответствуют нашим потребностям, то есть с нашими настраиваемыми функциями (или контроллерами), которые обращаются к базе данных.

Мы напишем наши функции в ccasControllers.js в качестве следующего шага.

Но сначала давайте настроим канал. Перейдите в / routes и напишите следующий код в ccasRoutes.js.

Вот что делает приведенный выше код:
В отношении конечной точки / customer:
GET - read - список всех клиентов
POST - создать - создать клиента

По отношению к конечной точке / customer /: customerId (это позволяет нам запрашивать конкретный customerId , созданный MongoDB) :
GET -
чтение - чтение клиента с / id
PUT—
чтение - обновление клиента с / id
УДАЛИТЬ -
прочитать - удалить клиента с / id

Милая, а теперь давайте напишем наши функции!

Настройка контроллеров

Мы закодировали структуру для хранения нашей информации, канал для доступа к нашим функциям, теперь нам нужно написать ... наши функции

Перейдите в / controllers, откройте ccasController.js и введите следующее:

Мы импортировали схему «Клиент» и теперь используем функции мангуста, чтобы:
1. find - найдите все записи в нашей базе данных клиентов
2. сохранить - создать новую запись и сохранить ее в базе данных
3. findById - найти запись с идентификатором
4. findOneAndUpdate - найдите одну запись с идентификатором и обновите изменения, указанные как параметры, для этой записи
5. remove - удалить запись с заданным идентификатором

Тестирование с почтальоном

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

Откройте почтальон и введите http://localhost:3000/customer в адресную строку.

Если вы выберете GET и нажмете «Отправить», вы должны увидеть [ ]. Почему? Ну, потому что у нас нет данных в нашей базе клиентов.

Давайте добавим покупателя.

Выберите POST, перейдите в Body, выберите x-www-form-urlencoded и введите данные:

Теперь, если вы выполните GET, вы должны увидеть введенные вами данные.

Попробуем обновить это.

Скопируйте _id объекта, который вы только что добавили в базу данных, и добавьте после URL-адреса. Сюда:

http://localhost:3000/customer/5a73a9df8bc3990e5daa9eef

Выберите PUT в Postman, перейдите к Body, выберите x-www-form-urlencoded и измените значение свойства, которое хотите. Здесь я поменял адрес. Улица

Подобно PUT, вы можете УДАЛИТЬ объект, используя _id

Потрясающие!

Мы настроили все для конечной точки / customer. Мы сделаем то же самое для других конечных точек / order и / supplier.

Ты можешь это сделать. Я верю в тебя!

Вы здесь: вы настроили все функции CRUD для маршрута / customer. И это гениально!

Давайте продолжим…

Добавление моделей заказов и поставщиков

Перейдите в папку / models и добавьте в orderModel.js следующее:

И это для supplierModel.js

Вы можете добавлять данные с помощью / order и / supplier, аналогично тому, как мы добавляли данные в / customer. Ниже вы найдете несколько примеров.

Настройка серверов поставщиков

ACME и RTS - наши два поставщика.

Нам нужно поговорить с этими серверами поставщиков, чтобы размещать заказы. Давайте запустим их серверы!

Перейдите в / servers, откройте acmeServer.js и введите следующее:

А теперь откройте rtsServer.js:

Обновление маршрутов

Нам нужно установить конечные точки, чтобы поразить наших поставщиков.

ACME маршруты

API ACME находится по адресу: /acme/api/v45.1/.

ACME позволяет нам делать POST запрос к конечной точке / order - для создания заказа.

Перейдите в / routes, создайте и откройте acmeRoutes.js и введите:

Маршруты RTS

API RTS находится по адресу: /rainier/v10.0/.

RTS позволяет нам сделать:
1. Запрос GET к конечной точке / nonce_token - получить токен для проверки.
2. POST запрос к конечной точке / request_customized_model - для создания заказа

Перейдите в / routes, откройте rtsRoutes.js и введите:

Обновление контроллеров

Время для функций поставщика! Мы почти закончили!

Контроллер ACME

Перейдите в / controllers, откройте acmeController.js и введите:

create_an_order проверяет api_key, отправленный CCAS, и, если он действителен, случайным образом генерирует order_id и отправляет его обратно в CCAS.

Контроллер RTS

Перейдите в / controllers, откройте rtsController.js и введите:

get_nonce_token проверяет, сделал ли запрос действительный магазин, а затем отправляет токен в CCAS.

create_an_order проверяет, получил ли он правильный токен от CCAS, случайным образом генерирует order_id и отправляет его обратно в CCAS.

Контроллер CCAS

В нашем ccasController.js есть только функции клиента. Нам нужно добавить функции «Поставщик» и «Заказ».

Перейдите в / controllers, обновите ccasController.js, добавив:

Функции поставщика точно такие же, как и функции клиента. Я добавил комментарии, и код не требует пояснений. Попробуй!

И мы закончили кодирование!

Тестирование всего проекта

Чтобы протестировать весь проект, нам нужны все запущенные серверы и экземпляр MongoDB.

Запустите экземпляр MongoDB в терминале usingmongod

Запустите все три сервера в отдельных терминалах:

npm run ccas
npm run acme
npm run rts

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

Все наши серверы работают! Мы можем заставить их разговаривать друг с другом и добиться успеха!

Теперь мы можем начать тестирование с помощью Postman

Создание поставщиков

Откройте Почтальон, перейдите по ссылке:

http://localhost:3000/supplier

Добавление ACME
Необходимая информация:

"supplierId": 111
"make": "ACME"
"api_key": "cascade.53bce4f1dfa0fe8e7ca126f91b35d3a6"

Выберите POST, выберите Body, выберите x-www-form-urlencoded, введите указанную выше информацию и нажмите "Отправить".

Добавление RTS
Необходимая информация:

"supplierId": 222
"make": "RTS"
"storefront": "ccas-bb9630c04f"

POST вышеуказанную информацию аналогично для RTS.

Выполните GET против / supplier , и вы увидите что-то вроде:

Размещение заказов

Это момент, которого мы все ждали. Это работает? Давайте разберемся!

Go to:

http://localhost:3000/order

Нам нужно предоставить { customerId, make, model, carPackage }

Давайте РАЗМЕСТИТЕ заказ в ACME. Нравится:

Приведенная ссылка является интерактивной, и вы перейдете к вашему заказу. Попытайся! Аккуратный!

Если указанный customerId недействителен (в нашей базе данных нет этого клиента), вы получите следующее сообщение:

Invalid CustomerId. CustomerId does not exist in the database

А если указан неверный make:

Incorrect “make” entered. Enter either ACME Autos or Rainier Transportation Solution

Точно так же вы можете оформить заказ в RTS. Двойной аккуратный!

** Некоторые другие интересные функции **

Безопасность

В целях безопасности все заказы могут просматривать только сотрудники.

Чтобы увидеть все заказы, перейдите по ссылке:

http://localhost:3000/orders

В ДОСТУПЕ ЗАПРЕЩЕНО!

Сотрудникам необходимо передать секретный PIN-код в качестве запроса, чтобы получить все данные. Сделай это:

http://localhost:3000/orders?pin=1123

..и вы должны увидеть отчет о заказах. Отлично!

Проверка адреса

К сожалению, CCAS обслуживает клиентов только в США. Таким образом, если адрес клиента находится за пределами США, CCAS не может продолжить оформление заказа.

Давай проверим это.

Добавьте клиента, у которого address.country не США. Нравится:

Теперь, если этот покупатель разместит заказ, он получит что-то вроде:

Это все, ребята. Это был длинный пост. Благодарю за терпение! Спасибо! Я серьезно. Надеюсь, вы чему-то научились из этого проекта. Может много.