FAUNADB является глобальной базой данных без серверов, созданной бывшими инженерами Twitter Evan Weaver и Matt Freels.
Следующее написано на Страница компании фауны :
Фауна-это уровень данных для этого нового поколения клиентских безревенных приложений.
FAUNADB предоставляет интерфейс веб-нему, поддерживая GraphQL и пользовательскую бизнес-логику, которая легко интегрируется с остальной бесвередной экосистемой. Основная глобально распределенная хранение и вычислительная платформа является быстрой, последовательной и надежной, с современной инфраструктурой безопасности. С фауной нет компромисса.
Это увлекательно! Когда я прочитал это, я хотел использовать его немедленно.
В этом уроке мы построим простое приложение с Next.js и попробуйте создать, получать, обновлять и удалять (CRUD) документы в FAUNADB.
Что мы будем:
- Зарегистрируйтесь на учетной записи FAUNADB
- Создайте базу данных в Консоль FAUNADB
- Создайте приложение Next.js
- Получить документы
- Получить документ
- Создайте документ
- Обновите документ
- Удалить документ
Обратите внимание, что эта статья, вероятно, будет длинной, поэтому я буду опустить подробные объяснения. По той же причине я также буду опустить все стили в исходном коде, но они включены GitHub Анкет
Зарегистрируйтесь на учетной записи FAUNADB
Перейти к Страница регистрации фауны и создать учетную запись Faunadb. Если у вас уже есть учетная запись FAUNADB, войдите в систему и перейдите в следующий раздел.
Создайте базу данных
Давайте создадим новую базу данных. Нажмите кнопку «Новая база данных» в консоли FAUNADB.
В этом уроке мы будем использовать демонстрационные данные, поэтому проверьте «предварительно заполнять демо-данными».
Нажмите кнопку «Сохранить», чтобы создать базу данных.
Как видите, демо -данных заполняются в базе данных. В каждой коллекции есть несколько документов, поэтому мы будем использовать их.
Создать ключ сервера
Нам нужно создать ключ сервера для доступа к Следующая Фауна-Круд база данных.
Перейдите в «Безопасность» в левом меню и нажмите кнопку «Новая клавиша».
Выберите «Сервер» для роли и нажмите кнопку «Сохранить».
После создания ключа вы должны увидеть свой Секрет ключа Анкет Секрет не будет отображаться снова, поэтому сохраните эту страницу открытой или скопируйте ее где -нибудь.
Создайте приложение Next.js
Давайте создадим приложение Next.js и сделаем некоторые подготовки к CRUD.
Создайте новое приложение Next.js, используя Create-next-App , который называется «следующая фаунаруд» в этом уроке:
yarn create next-app next-fauna-crud
Начните Dev сервер и посмотрите результат в вашем браузере:
cd next-fauna-crud yarn dev
Установить зависимости
Заранее установите зависимости, используемые в этом уроке:
yarn add faunadb swr react-hook-form
FAUNADB: Драйвер JavaScript, необходимый для взаимодействия с FAUNADB.SWR: Библиотека React Hooks для извлечения данных.Реакция-крючка формы: Библиотека проверки формы для легко создания форм с меньшим количеством кода.
Настройка переменных среды
Создайте новый файл с названием .env.local В корне вашего проекта и установите следующую переменную:
FAUNA_SERVER_KEY=
Установите секрет ключа вашего сервера, созданный в консоли FAUNADB.
Создать создание клиента
Создайте экземпляр клиента, который использует только что настройку сервера, который мы только что настроили.
- Создайте каталог верхнего уровня под названием
utilsАнкет - Внутри, создайте файл:
Fauna-Auth.jsАнкет
// utils/fauna-auth.js
import faunadb from 'faunadb';
export const serverClient = new faunadb.Client({
secret: process.env.FAUNA_SERVER_KEY,
});
Получить документы
Теперь давайте попробуем Круд!
Во -первых, мы попробуем извлечь данные, получить все документы в коллекции «клиентов» и перечислить их в таблице.
Создать маршрут API
- Создайте каталог под названием
КлиентывСтраницы/APIАнкет - Создайте файл с именем
index.jsвСтраницы/API/клиентыАнкет
// pages/api/customers/index.js
import { query as q } from 'faunadb';
import { serverClient } from '../../../utils/fauna-auth';
export default async (req, res) => {
try {
const customers = await serverClient.query(
q.Map(
// iterate each item in result
q.Paginate(
// make paginatable
q.Match(
// query index
q.Index('all_customers') // specify source
)
),
(ref) => q.Get(ref) // lookup each result by its reference
)
);
// ok
res.status(200).json(customers.data);
} catch (e) {
// something went wrong
res.status(500).json({ error: e.message });
}
};
FAUNADB предлагает свой собственный язык запросов под названием Fql (Язык запросов фауны). Это предоставляет много Встроенные функции Это может быть использовано для запроса или мутированных баз данных FAUNADB. Карта , Страница , Матч , Индекс и Получить Функции являются одними из них. Для получения дополнительной информации о каждой встроенной функции, ознакомьтесь с FQL Chief -Spet Страница в Фауна документация Анкет
all_customers Индекс был создан автоматически при создании базы данных, поэтому вы можете найти ее в своей консоли FAUNADB.
Создать страницу списка
Мы будем использовать нашу домашнюю страницу, чтобы перечислить документы. Open Страницы/index.js и перезаписать это следующим образом:
// pages/index.js
import useSWR from 'swr';
import Layout from '../components/layout';
import DataRow from '../components/data-row';
const fetcher = (url) => fetch(url).then((r) => r.json());
const Home = () => {
const { data, error } = useSWR('/api/customers', fetcher);
if (error) return failed to load;
return (
Next Fauna CRUD
Customer Data
name
telephone
credit card
{data ? (
data.map((d) => (
))
) : (
<>
)}
);
};
export default Home;
Основное использование SWR как указано выше. С ним логика извлечения данных настолько упрощена. Удивительно! Узнайте больше о SWR Анкет
Создать компонент таблицы
- Создайте каталог верхнего уровня под названием
КомпонентыАнкет - Внутри, создайте файл:
data-drow.js.
// components/data-row.js
import Link from 'next/link';
const DataRow = ({
id,
firstName,
lastName,
telephone,
creditCard,
loading,
}) => (
);
export default DataRow;
Создать компонент макета
Создайте компонент макета, который будет распространен на всех страницах:
- Создайте файл с именем
Mayout.jsвКомпонентыкаталог.
// components/layout.js
import Head from 'next/head';
const Layout = ({ children }) => (
<>
Next Fauna CRUD
{children}
);
export default Layout;
Теперь мы должны быть в состоянии получить и отображать все данные клиента. Перезагрузить Dev Сервер для загрузки переменных среды, а затем получить доступ http://localhost: 3000/ :
Хорошо, мы успешно взяли все данные клиентов.
Получить документ
Далее мы попробуем получить конкретный документ клиента.
Создать маршрут API
- Создайте каталог под названием
[id]вСтраницы/API/клиентыАнкет - Создайте файл с именем
index.jsвСтраницы/API/клиенты/[id]Анкет
Создать динамические маршруты В приложениях Next.js используйте имя каталога (или имя файла) с скобками, как указано выше. Если вы новичок в next.js, ознакомьтесь с документацией Здесь Анкет
// pages/api/customers/[id]/index.js
import { query as q } from 'faunadb';
import { serverClient } from '../../../../utils/fauna-auth';
export default async (req, res) => {
const {
query: { id },
} = req;
try {
const customer = await serverClient.query(
q.Get(q.Ref(q.Collection('customers'), id))
);
res.status(200).json(customer.data);
} catch (e) {
res.status(500).json({ error: e.message });
}
};
Чтобы получить конкретный документ, вам нужен его Стоимость (ID), но вы можете получить его, как указано выше.
Создайте детальную страницу
- Создайте каталог под названием
Клиентывстраницыкаталог. - Создайте каталог под названием
[id]вСтраницы/клиентыАнкет - Создайте файл с именем
index.jsвСтраницы/клиенты/[id]Анкет
// pages/customers/[id]/index.js
import { useRouter } from 'next/router';
import useSWR from 'swr';
import Layout from '../../../components/layout';
const fetcher = (url) => fetch(url).then((r) => r.json());
const Customer = () => {
const router = useRouter();
const { id } = router.query;
const { data, error } = useSWR(`/api/customers/${id}`, fetcher);
if (error) return failed to load;
return (
Customer
{data ? (
{data.firstName} {data.lastName}
{data.telephone}
{data.creditCard.number}
) : (
loading...
)}
);
};
export default Customer;
Получение Запрос объект тоже легко. Просто используйте userouter крюк предоставлен next.js.
Давайте посмотрим на страницу деталей. Перейдите на домашнюю страницу и нажмите на любого клиента:
Ладно, заработка документов прошло хорошо.
Создайте документ
В -третьих, мы попробуем создать новый документ.
Создать маршрут API
Создайте файл с именем create.js в Страницы/API/клиенты :
// pages/api/customers/create.js
import { query as q } from 'faunadb';
import { serverClient } from '../../../utils/fauna-auth';
export default async (req, res) => {
const { firstName, lastName, telephone, creditCardNumber } = req.body;
try {
await serverClient.query(
q.Create(q.Collection('customers'), {
data: {
firstName,
lastName,
telephone,
creditCard: {
number: creditCardNumber,
},
},
})
);
res.status(200).end();
} catch (e) {
res.status(500).json({ error: e.message });
}
};
Мы снова будем использовать коллекцию “клиентов”. Просто укажите данные сбора и документа в Создать функция Это очень просто.
Создайте страницу Create
Создайте страницу с формой для добавления новых клиентов:
- Создайте файл с именем
create.jsвСтраницы/клиентыАнкет
// pages/customers/create.js
import { useState } from 'react';
import Router from 'next/router';
import { useForm } from 'react-hook-form';
import Layout from '../../components/layout';
const Create = () => {
const [errorMessage, setErrorMessage] = useState('');
const {
handleSubmit,
register,
formState: { errors },
} = useForm();
const onSubmit = handleSubmit(async (formData) => {
if (errorMessage) setErrorMessage('');
try {
const res = await fetch('/api/customers/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});
if (res.status === 200) {
Router.push('/');
} else {
throw new Error(await res.text());
}
} catch (error) {
console.error(error);
setErrorMessage(error.message);
}
});
return (
Create Customer
{errorMessage && (
{errorMessage}
)}
);
};
export default Create;
Извините за длинный код. Это потому, что он включает в себя обработку ошибок. Приведенная выше форма построена с React Hook Form , поэтому он должен иметь меньше кода, чем обычно. Узнайте больше о форме React Hook Анкет
Если документ создан успешно, вы будете перенаправлены на домашнюю страницу.
Добавить ссылку Create
Open Страницы/index.js и добавьте ссылку на страницу Create:
// pages/index.js
import Link from 'next/link'; // add
...
const Home = () => {
...
return (
Next Fauna CRUD
{/* add */}
Create New Customer
...
);
};
export default Home;
Теперь мы готовы создать документ. Перейдите на домашнюю страницу и нажмите на ссылку, которую мы только что добавили.
Выглядит хорошо. Попробуйте нажать кнопку «Создать», не вводя ничего.
Обработка ошибок работает хорошо.
Затем введите значения, чтобы создать клиента.
Это сработало! Новый документ был создан в коллекции «клиентов».
Обновите документ
Затем мы попробуем обновить документ.
Создать маршрут API
Создайте файл с именем Update.js в Страницы/API/клиенты/[id] :
// pages/api/customers/[id]/update.js
import { query as q } from 'faunadb';
import { serverClient } from '../../../../utils/fauna-auth';
export default async (req, res) => {
const {
query: { id },
} = req;
const { firstName, lastName, telephone, creditCardNumber } = req.body;
try {
await serverClient.query(
q.Update(q.Ref(q.Collection('customers'), id), {
data: {
firstName,
lastName,
telephone,
creditCard: {
number: creditCardNumber,
},
},
})
);
res.status(200).end();
} catch (e) {
res.status(500).json({ error: e.message });
}
};
Это похоже на комбинацию маршрута API для создания документа и маршрута API для получения документа. Единственное новое, что Обновление Функция используется.
Создать страницу обновления
Создайте файл с именем Update.js в Страницы/клиенты/[id] :
// pages/customers/[id]/update.js
import { useRouter } from 'next/router';
import useSWR from 'swr';
import Layout from '../../../components/layout';
import EditForm from '../../../components/edit-form';
const fetcher = (url) => fetch(url).then((r) => r.json());
const Update = () => {
const router = useRouter();
const { id } = router.query;
const { data, error } = useSWR(`/api/customers/${id}`, fetcher);
if (error) return failed to load;
return (
{data ? : loading...}
);
};
export default Update;
Страница обновления должна получить данные в качестве значений по умолчанию, поэтому создайте форму отдельно. Пройти значения по умолчанию и id Отправление к Editform компонент, который мы создадим дальше.
Создать компонент формы
Создайте файл с именем РЕДАКТИРОВАТЬ ФОРМ.JS в Компоненты каталог:
// components/edit-form.js
import { useState } from 'react';
import Router from 'next/router';
import { useForm } from 'react-hook-form';
const EditForm = ({ defaultValues, id }) => {
const [errorMessage, setErrorMessage] = useState('');
const { handleSubmit, register, formState: { errors } } = useForm({
defaultValues: {
...defaultValues,
creditCardNumber: defaultValues.creditCard.number,
},
});
const onSubmit = handleSubmit(async (formData) => {
if (errorMessage) setErrorMessage('');
try {
const res = await fetch(`/api/customers/${id}/update`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});
if (res.status === 200) {
Router.push('/');
} else {
throw new Error(await res.text());
}
} catch (error) {
console.error(error);
setErrorMessage(error.message);
}
});
return (
// almost the same as the creation form
);
};
export default EditForm;
Я пропустил часть JSX, потому что она почти такая же, как и на странице Create. Вы можете найти его на GitHub Анкет
Добавить ссылку на редактирование
Open Страницы/клиенты/[id]/index.js и добавить ссылку на страницу обновления:
// pages/customers/[id]/index.js
...
import Link from 'next/link'; // add
...
const Customer = () => {
...
return (
...
{data ? (
...
{/* add */}
) : (
...
)}
);
};
export default Customer;
Теперь перейдите на страницу деталей любого клиента и нажмите на ссылку «Редактировать», которую мы только что добавили.
Хорошо, текущие данные отображаются в каждом поле ввода.
Давайте отредактируем любое значение и обновим данные. Я смену название этого клиента на «Таро Ямада».
Имя клиента обновилось. Идеальный!
Удалить документ
Наконец, мы попробуем удалить документ.
Создать маршрут API
Создайте файл с именем delete.js в Страницы/API/клиенты/[id] :
// pages/api/customers/[id]/delete.js
import { query as q } from 'faunadb';
import { serverClient } from '../../../../utils/fauna-auth';
export default async (req, res) => {
const {
query: { id },
} = req;
try {
await serverClient.query(q.Delete(q.Ref(q.Collection('customers'), id)));
res.status(200).end();
} catch (e) {
res.status(500).json({ error: e.message });
}
};
Документ может быть удален с помощью Удалить функция
Добавить кнопку удаления
Open Страницы/клиенты/[id]/index.js и добавить кнопку, чтобы удалить документ:
// pages/customers/[id]/index.js
...
const Customer = () => {
...
// add
const onClick = async () => {
try {
const res = await fetch(`/api/customers/${id}/delete`, {
method: 'DELETE',
});
if (res.status === 200) {
router.push('/');
} else {
throw new Error(await res.text());
}
} catch (error) {
console.error(error);
}
};
...
return (
...
{data ? (
...
...
{/* add */}
) : (
...
)}
);
};
export default Customer;
Вот и все. Код для операции удаления очень прост. Если документ успешно удален, вы будете перенаправлены на домашнюю страницу.
Теперь перейдите на страницу деталей любого клиента и попробуйте удалить документ.
Да! Все операции CRUD завершены.
Вывод
В этом уроке я продемонстрировал, как выполнять операции CRUD в FAUNADB, используя язык запросов фауны (FQL). В следующий раз я напишу о том, как использовать Graphql вместо FQL. В настоящее время в FAUNADB есть несколько примеров операций CRUD с использованием приложений, поэтому я надеюсь, что эта статья полезна.
Вы можете найти код для этого урока по GitHub Анкет
Оригинал: “https://dev.to/kjmczk/crud-app-with-next-js-and-faunadb-574d”