Этот пост является частью серии руководств по созданию приложения с базой данных DataStax’s Astra. Просмотрите все сообщения из этой серии Better Botz, чтобы начать использовать Astra прямо сейчас.
В последней записи блога мы настроили бэкэнд-сервер Express на Node.js, а затем подключились к нашей базе данных Astra с помощью драйвера DataStax Node.js. Мы получили данные из нашей таблицы заказов только для того, чтобы понять, что она пуста. Не бойся! Мы собираемся исправить эту ситуацию в этом посте, а также начнем использовать Glitch для ускорения разработки нашего приложения для заказов Better Botz.
Цель 1. Настройте Glitch с помощью пакета безопасного подключения.
Если у вас еще нет учетной записи Glitch, перейдите на Glitch и создайте учетную запись. После создания учетной записи откройте этот Better Botz project.
- В Glitch откройте проект Better Botz.
- Нажмите Remix to Edit в правом верхнем углу, чтобы создать копию проекта. Когда вы делаете ремикс проекта на Glitch, вы создаете копию существующего проекта, которую можете редактировать. Думайте об этом как о разветвлении репозитория GitHub.
- В вашем обновленном проекте перетащите или загрузите пакет безопасного подключения для вашей базы данных DataStax Astra.
Пакет безопасного подключения добавлен к вашим активам, но нам нужно, чтобы он находился в безопасном месте. Поэтому мы переместим его в скрытый каталог.
- В проекте с ремиксом в навигаторе проектов слева нажмите Новый файл.
- Введите .data и нажмите Добавить этот файл. Новый каталог .data не будет отображаться в навигаторе вашего проекта, а будет создан как скрытый каталог.
- В нижней части навигатора проектов нажмите Инструменты › Терминал, чтобы открыть терминал для вашего проекта.
- В терминале 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}”}’
- В браузере авторизуйтесь в DataStax Astra.
- Выберите базу данных, к которой вы хотите подключиться.
- В 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, чтобы добавить столбец количества.
- Скопируйте следующий запрос, который вы используете для добавления столбца количества в таблицу заказов в пространстве ключей 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
– это первичный ключ, определяющий расположение и порядок хранения данных. Первый столбец, объявленный в определении первичного ключа, — это ключ раздела, к которому мы перейдем в следующем разделе при создании таблицы доставки.
Чтобы добавить больше строк:
- Скопируйте параметр
changeset
для каждого из следующих примеров и заменитеchangeset
, определенный опцией--data
вызова. - Замените первичный ключ в опции
--url
, чтобы использовать значение, указанное перед примером. - Запустите команду 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"}'
- Замените следующие значения значениями для вашей базы данных:
- Замените
{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 и выполните следующие шаги:
- Отредактируйте сценарий
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 для получения данных из ваших таблиц и из них.