Этот пост является частью серии руководств по созданию приложения с базой данных DataStax’s Astra. Просмотрите все сообщения из этой серии Better Botz, чтобы начать использовать Astra прямо сейчас.

В последней записи блога мы настроили бэкэнд-сервер Express на Node.js, а затем подключились к нашей базе данных Astra с помощью драйвера DataStax Node.js. Мы получили данные из нашей таблицы заказов только для того, чтобы понять, что она пуста. Не бойся! Мы собираемся исправить эту ситуацию в этом посте, а также начнем использовать Glitch для ускорения разработки нашего приложения для заказов Better Botz.

Цель 1. Настройте Glitch с помощью пакета безопасного подключения.

Если у вас еще нет учетной записи Glitch, перейдите на Glitch и создайте учетную запись. После создания учетной записи откройте этот Better Botz project.

  1. В Glitch откройте проект Better Botz.
  2. Нажмите Remix to Edit в правом верхнем углу, чтобы создать копию проекта. Когда вы делаете ремикс проекта на Glitch, вы создаете копию существующего проекта, которую можете редактировать. Думайте об этом как о разветвлении репозитория GitHub.
  3. В вашем обновленном проекте перетащите или загрузите пакет безопасного подключения для вашей базы данных DataStax Astra.

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

  1. В проекте с ремиксом в навигаторе проектов слева нажмите Новый файл.
  2. Введите .data и нажмите Добавить этот файл. Новый каталог .data не будет отображаться в навигаторе вашего проекта, а будет создан как скрытый каталог.
  3. В нижней части навигатора проектов нажмите Инструменты › Терминал, чтобы открыть терминал для вашего проекта.
  4. В терминале Glitch для вашего проекта перейдите в каталог .data.
cd ~/.data

5. В навигаторе проекта выберите папку ресурсов, щелкните правой кнопкой мыши пакет безопасного подключения и скопируйте URL-адрес этого файла.

6. В терминале Glitch в каталоге .data используйте wget для загрузки пакета безопасного подключения:

wget secure-connect-bundle-url

7. Замените secure-connect-bundle-url URL-адресом пакета безопасного подключения, который вы скопировали на предыдущем шаге.

8. Выберите папку ресурсов, выберите пакет безопасного подключения и удалите его.

9. Переименуйте пакет безопасного подключения в secure-connect.zip.

mv secure-connect-bundle-name secure-connect.zip

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

Цель 2. Добавление данных о заказе

Если вы помните из последнего поста, мы извлекли данные из нашей таблицы заказов только для того, чтобы обнаружить, что она пуста. Для обработки заказов клиентов нам нужны данные заказа!

В предыдущих постах мы создавали таблицы и вставляли данные с помощью оболочки Cassandra Query Language SHell (CQLSH), встроенной в Astra. Такая практика вполне приемлема, но мы не специалисты по CQL и предпочли бы использовать более программный инструмент. Поэтому воспользуемся Astra Data API.

Создание токена авторизации

В Учебнике по началу работы в документации по API Astra показаны шаги, необходимые для подключения к базе данных Astra и взаимодействия с ней. Следуя этим инструкциям, мы будем использовать команды cURL в этом примере. Используйте эту команду cURL при выполнении следующих шагов для создания токена авторизации.

Совет. Если вы хотите выполнять команды из своего приложения, выберите конечную точку API, с которой вы хотите работать, выберите предпочитаемый язык и введите необходимые данные для конечной точки. Пример автоматически обновляется введенными вами значениями, что упрощает копирование и вставку в вашу среду IDE.

curl — request POST  — url https://{databaseid}-{region}.apps.astra.datastax.com/api/rest/v1/auth \
— header ‘accept: */*’ \
— header ‘content-type: application/json’ \
— header ‘x-cassandra-request-id: {unique-UUID}’ \
— data ‘{“username”:”{database-user}”,”password”:”{database-password}”}’
  1. В браузере авторизуйтесь в DataStax Astra.
  2. Выберите базу данных, к которой вы хотите подключиться.
  • В URL-адресе Astra скопируйте databaseid вашей базы данных, который является последним UUID в пути: https://astra.datastax.com/org/{org-Id}/database/{databaseid}
  • Выберите базу данных, к которой вы хотите подключиться, и скопируйте облачный регион, в котором находится ваша база данных. Например, us-east1.
  • Скопируйте имя пользователя и пароль, которые вы ввели при создании базы данных.

3. В ранее скопированном примере cURL замените эти значения значениями для вашей базы данных:

  • {databaseid} с UUID вашей базы данных, скопированным из URL-адреса Astra.
  • {region} с облачным регионом, в котором находится ваша база данных, как указано на странице сведений о базе данных в Astra. Например, us-east1.
  • {unique-UUID} со случайно сгенерированным UUID, уникальным для запроса авторизации.
  • {database-user} — это имя пользователя, введенное при создании базы данных.
  • {database-password} — пароль для указанного имени пользователя.

4. В командной строке выполните всю команду cURL со значениями для вашей базы данных.
Возвращается токен авторизации:

{“authToken”: “37396a44-dcb8–4740-a97f-79f0dba47973”}

5. Скопируйте значение токена авторизации, который вы будете включать при выполнении запросов к базе данных, таких как создание таблиц, добавление строк или изменение столбцов. В этом примере значение токена авторизации — 37396a44-dcb8–4740-a97f-79f0dba47973.

Вставка данных в таблицу заказов

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

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

Мы будем использовать конечную точку добавить столбец DataStax Astra API, чтобы добавить столбец количества.

  1. Скопируйте следующий запрос, который вы используете для добавления столбца количества в таблицу заказов в пространстве ключей betterbotz.
curl — request POST 
— url https://{databaseid}-{region}.apps.astra.datastax.com/api/rest/v1/keyspaces/{my_keyspace}/tables/orders/columns 
— header ‘accept: application/json’ 
— header ‘content-type: application/json’ 
— header ‘x-cassandra-request-id: {unique-UUID}’ 
— header ‘x-cassandra-token: {auth-token}’ 
— data ‘{“static”:false,”name”:”quantity”,”typeDefinition”:”int”}’

2. Замените следующие значения значениями для вашей базы данных:

  • Замените {databaseid} на UUID вашей базы данных, скопированный из URL-адреса Astra.
  • Замените {region} облачным регионом, в котором находится ваша база данных, как указано на странице сведений о базе данных в Astra. Например, us-east1.
  • Измените my_keyspace, чтобы оно соответствовало имени вашего пространства ключей, которое будет betterbotz, если вы следили за предыдущими записями в блоге.
  • Введите {unique-UUID} для запроса и {auth-token}, который вы создали ранее.

3. Запустите вызов cURL, чтобы добавить столбец количества в таблицу заказов в указанном пространстве ключей. Если вызов успешен, возвращается сообщение с указанием: {“success”:true}

Теперь, когда столбцы нашей таблицы обновлены, мы будем использовать конечную точку update rows для добавления данных в нашу таблицу заказов. Скопируйте следующую команду cURL и замените те же переменные, что и в предыдущих шагах.

curl — request PUT 
— url https://databaseid-region.apps.astra.datastax.com/api/rest/v1/keyspaces/keyspaceName/tables/tableName/rows/Otto%20Octavius 
— header ‘accept: application/json’ 
— header ‘content-type: application/json’ 
— header ‘x-cassandra-request-id: X-Cassandra-Request-Id’ 
— header ‘x-cassandra-token: X-Cassandra-Token’ 
— data ‘{“changeset”:[{“column”:”id”,”value”:”e65063a7-fba3–41ba-84bb-740a01cacf5e”},{“column”:”address”,”value”:”2475 Shadow Ln. Stow, Ohio(OH), 44224"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb0"},{“column”:”prod_name”,”value”:”Heavy Lift Arms”},{“column”:”description”,”value”:”Heavy lift arms capable of lifting 1,250 lbs of weight per arm. Sold as a set.”},{“column”:”price”,”value”:4199.99},{“column”:”quantity”,”value”:5},{“column”:”sell_price”,”value”:21000.96}]}’

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

Обратите внимание, что Otto%20Octavius используется в опции --url, но customer_name не включено в набор изменений. Это связано с тем, что customer_name – это первичный ключ, определяющий расположение и порядок хранения данных. Первый столбец, объявленный в определении первичного ключа, — это ключ раздела, к которому мы перейдем в следующем разделе при создании таблицы доставки.

Чтобы добавить больше строк:

  1. Скопируйте параметр changeset для каждого из следующих примеров и замените changeset, определенный опцией --data вызова.
  2. Замените первичный ключ в опции --url, чтобы использовать значение, указанное перед примером.
  3. Запустите команду cURL с обновленными данными.

Например, вот обновленный параметр changeset для клиента по имени Десмонд Блэквелл. Поскольку customer_name является первичным ключом, --url меняется на:

https://databaseid-region.apps.astra.datastax.com/api/rest/v1/keyspaces/keyspaceName/tables/tableName/rows/Desmond%20Blackwell

Первичный ключ = Desmond%20Blackwell

‘{“changeset”:[{“column”:”id”,”value”:”e5a768fc-ffdd-49e9-a179-b491e024088a”},{“column”:”address”,”value”:”91 Dogwood Dr. Bridgeport, Connecticut (CT) 06606"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb8"},{“column”:”prod_name”,”value”:”Precision Torso”},{“column”:”description”,”value”:”Robot torso built to handle precision jobs with extra stability and accuracy reinforcement.”},{“column”:”price”,”value”:8199.99},{“column”:”quantity”,”value”:3},{“column”:”sell_price”,”value”:24599.97}]}’

Используйте следующие примеры, чтобы сделать дополнительные вызовы строки обновления, изменив первичный ключ, заменив changeset и снова запустив команду cURL.

Первичный ключ = Loretta%20Stillwell

‘{“changeset”:[{“column”:”id”,”value”:”fae7c26c-7bc4–41e0–9e9f-63905cc38944"},{“column”:”address”,”value”:”1314 Lindwood Dr. Carter Lake, Iowa (IA) 51510"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb7"},{“column”:”prod_name”,”value”:”Medium Strength Torso”},{“column”:”description”,”value”:”Robot body to handle general jobs.”},{“column”:”price”,”value”:1999.99},{“column”:”quantity”,”value”:2},{“column”:”sell_price”,”value”:3999.98}]}’

Первичный ключ = Matt%20Williamson

‘{“changeset”:[{“column”:”id”,”value”:”02668188–7b74–4ac6-bb4b-273b14bbda7e”},{“column”:”address”,”value”:”15900 Wilcox Ln. Marion, Michigan (MI) 49665"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb6"},{“column”:”prod_name”,”value”:”High Strength Torso”},{“column”:”description”,”value”:”Robot body with reinforced plate to handle heavy workload and weight during jobs.”},{“column”:”price”,”value”:2999.99},{“column”:”quantity”,”value”:6},{“column”:”sell_price”,”value”:13199.94}]}’

Первичный ключ = Джаяшри%20Маршалл

‘{“changeset”:[{“column”:”id”,”value”:”295c362d-2eaf-43c0-bd68–63efc2cd1767"}{“column”:”address”,”value”:”107 Trulson St. Oakland, Nebraska (NE), 68045"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb5"},{“column”:”prod_name”,”value”:”Basic Task CPU”},{“column”:”description”,”value”:”Head processor unit for robot with basic process tasks.”},{“column”:”price”,”value”:899.99},{“column”:”quantity”,”value”:5},{“column”:”sell_price”,”value”:4499.95}]}’

Первичный ключ = Эвелин%20Дэвис

‘{“changeset”:[{“column”:”id”,”value”:”5305ff90-e838–46ea-860f-69e831d28146"},{“column”:”address”,”value”:”36 Jasmine Ln. Valley Stream, New York(NY), 11581"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb4"},{“column”:”prod_name”,”value”:”High Process AI CPU”},{“column”:”description”,”value”:”Head processor unit for robot with basic process tasks.”},{“column”:”price”,”value”:2199.99},{“column”:”quantity”,”value”:12},{“column”:”sell_price”,”value”:26399.88}]}’

Первичный ключ = Wyatt%20Devonshire

‘{“changeset”:[{“column”:”id”,”value”:”bccaed73-e7fb-4f16–8799–206e08905161"},{“column”:”address”,”value”:”2770 Raymond St. Forest Grove, Oregon(OR), 97116"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb3"},{“column”:”prod_name”,”value”:”Drill Arms”},{“column”:”description”,”value”:”Arms for drilling into surface material. Sold as a set. Does not include drill bits.”},{“column”:”price”,”value”:2199.99},{“column”:”quantity”,”value”:3},{“column”:”sell_price”,”value”:6599.97}]}’

Первичный ключ = Лаванда%20Честерфилд

‘{“changeset”:[{“column”:”id”,”value”:”ccc5bc2d-d166–471b-ad44–68be45663545"},{“column”:”address”,”value”:”250 Holmes Blvd #1A Gretna, Louisiana(LA), 70056"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb1"},{“column”:”prod_name”,”value”:”Precision Action Arms”},{“column”:”description”,”value”:”Arms for precision activities in manufacturing or repair. Sold as a set.”},{“column”:”price”,”value”:12199.99},{“column”:”quantity”,”value”:1},{“column”:”sell_price”,”value”:12199.99}]}’

Первичный ключ = Дариус%20Смит

‘{“changeset”:[{“column”:”id”,”value”:”3c371be4–203c-497f-a1eb-79769d3526a8"},{“column”:”address”,”value”:”199 State U Rd. Macks Creek, Missouri (MO), 65786"},{“column”:”prod_id”,”value”:”31047029–2175–43ce-9fdd-b3d568b19bb2"},{“column”:”prod_name”,”value”:”Medium Lift Arms”},{“column”:”description”,”value”:”Medium lift arms capable of lifting 850 lbs of weight per arm. Sold as a set.”},{“column”:”price”,”value”:3199.99},{“column”:”quantity”,”value”:1},{“column”:”sell_price”,”value”:3199.99}]}’

Цель 3: Отслеживание отправляемых заказов

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

Скопируйте следующий запрос, который вы используете для создания таблицы доставки в пространстве ключей betterbotz.

В следующем примере shipping — это имя таблицы (см. последнюю строку). Столбцы таблицы определяются определениями столбцов, такими как id, prod_id, cust_id и address_id.

Помните первичный ключ, который мы использовали ранее при обновлении таблицы заказов? Мы также упомянули ключ раздела (partitionKey), который представляет собой специальный столбец, определяющий самую внешнюю группу данных, аналогичную схеме в реляционной базе данных. Для таблицы доставки наш ключ раздела использует два столбца: prod_name и customer_name.

curl --request POST \
--url https://{databaseid}-{region}.apps.astra.datastax.com/api/rest/v1/keyspaces/{my_keyspace}/tables \
--header 'accept: */*' \
--header 'content-type: application/json' \
--header 'x-cassandra-request-id: {unique-UUID}' \
--header 'x-cassandra-token: {auth-token}' \
--data '{"ifNotExists":true,"columnDefinitions":[
{"static":false,"name":"id","typeDefinition":"uuid"},
{"static":false,"name":"prod_id","typeDefinition":"uuid"},
{"static":false,"name":"cust_id","typeDefinition":"uuid"},
{"static":false,"name":"address_id","typeDefinition":"uuid"},
{"static":false,"name":"prod_name","typeDefinition":"text"},
{"static":false,"name":"customer_name","typeDefinition":"text"},
{"static":false,"name":"street","typeDefinition":"text"},
{"static":false,"name":"city","typeDefinition":"text"},
{"static":false,"name":"state","typeDefinition":"text"},
{"static":false,"name":"country","typeDefinition":"text"},
{"static":false,"name":"code","typeDefinition":"text"}],
"primaryKey":{"partitionKey":["prod_name","customer_name"]},
"tableOptions":{"defaultTimeToLive":0},"name":"shipping"}'
  1. Замените следующие значения значениями для вашей базы данных:
  • Замените {databaseid} на UUID вашей базы данных, скопированный из URL-адреса Astra.
  • Замените {region} облачным регионом, в котором находится ваша база данных, как указано на странице сведений о базе данных в Astra. Например, us-east1.
  • Измените my_keyspace, чтобы оно соответствовало имени вашего пространства ключей, которое будет betterbotz, если вы следили за предыдущими записями в блоге.
  • Введите {unique-UUID} для запроса и {auth-token}, который вы создали ранее.
  • В опции --data вызова мы определим столбцы таблицы, используя параметр columnDefinitions.

2. Запустите вызов cURL, чтобы создать таблицу shipping в указанном пространстве ключей. Если вызов успешен, возвращается сообщение с указанием: {“success”:true}

Давайте воспользуемся конечной точкой get table для получения только что созданной таблицы. Замените те же переменные, что и в предыдущих шагах, а затем замените {tableName} именем вашей таблицы (то есть shipping).

curl — request GET \ 
— url https://{databaseid}-{region}.apps.astra.datastax.com/api/rest/v1/keyspaces/{keyspaceName}/tables/{tableName} \
— header ‘accept: application/json’ \
— header ‘x-cassandra-request-id: {unique-UUID}’ \
— header ‘x-cassandra-token: {auth-token}’

Выполнение этой команды cURL с введенными вами переменными возвращает данные для вашей таблицы доставки, но это не совсем понятно для человека. Вы можете добавить символ вертикальной черты и json_pp в конце команды cURL, чтобы предоставить отформатированный ответ JSON, но клиентам нужен более простой способ доступа к этим данным о доставке.

{“name”:”shipping”,”keyspace”:”betterbotz”,”columnDefinitions”:[{“Name”:”customer_name”,”TypeDefinition”:”text”},{“Name”:”id”,”TypeDefinition”:”uuid”},{“Name”:”prod_name”,”TypeDefinition”:”text”},{“Name”:”city”,”TypeDefinition”:”text”},{“Name”:”cust_id”,”TypeDefinition”:”uuid”},{“Name”:”country”,”TypeDefinition”:”text”},{“Name”:”prod_id”,”TypeDefinition”:”uuid”},{“Name”:”state”,”TypeDefinition”:”text”},{“Name”:”street”,”TypeDefinition”:”text”},{“Name”:”address_id”,”TypeDefinition”:”uuid”},{“Name”:”code”,”TypeDefinition”:”text”}],”primaryKey”:{“PartitionKey”:[“prod_name”],”clusteringKey”:[“customer_name”]},”tableOptions”:{“DefaultTimeToLive”:null,”clusteringExpression”:[{“Column”:”customer_name”,”Order”:”asc”}]}}

А как насчет вашего приложения в Glitch? Рад, что вы спросили! Теперь, когда в вашей таблице заказов есть данные, вы можете увидеть, как они возвращаются вашим приложением. Откройте свой проект Glitch и выполните следующие шаги:

  1. Отредактируйте сценарий sample-run.sh, включив в него имя пользователя и пароль базы данных Astra.
ASTRAUSER=username ASTRAPASSWORD=password

2. Нажмите Инструменты › Терминал, чтобы открыть терминал, подключенный к вашему проекту.

3. В терминале из вашего домашнего каталога (~) запустите скрипт ./sample-run.sh, чтобы запустить сервер, используя ваши учетные данные Astra:

cd ~ &&
./sample-run.sh

4. При работающем сервере откройте браузер и перейдите по следующим путям, чтобы просмотреть примеры извлечения данных. В каждом URL-адресе измените имя вашего проекта на имя вашего проекта Glitch:

  • Этот URL-адрес подтверждает, что сервер Express работает с включенными шаблонами Jade.
    https://your-project-name.glitch.me/
  • Конечная точка /data включает необработанные данные, которые являются прямым ответом на ответ JSON, полученным с помощью вызова API GET.
    https://your-project-name.me/data
  • Конечная точка /datareport — это ответ, который включает результаты данных, сгенерированные из шаблона Jade. В соответствии с настройками заказы клиентов будут отображаться на этой конечной точке.
    https://your-project-name.glitch.me/datareport

Ваши данные возвращаются в конечной точке /data и форматируются в удобочитаемой форме в конечной точке /datareport. Ты сделал это! Этот шаг является важным этапом в создании системы онлайн-заказов для Better Botz.

В следующем посте мы разработаем средства для быстрого и простого управления операциями CRUD (создание, чтение, обновление, удаление), которые мы создадим с помощью Glitch и Express.js для получения данных из ваших таблиц и из них.