Обработка POST запроса, отправленного с помощью thunk в Redux

Мы с вами получили данные продуктов и продавцов с сервера и вывели их в приложение. Но с помощью thunk можно не только получать, но и отправлять данные. Давайте узнаем, как это делать.

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

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

Откроем наше приложение с продуктами, а в нем файл server.js. Найдем в нем массив handlers и добавим в него еще один обработчик для POST-запроса. Здесь мы будем принимать еще и тело запроса, поэтому в callback мы должны передать request:

http.post('/fakeServer/products', async ({ request }) => {})

Теперь в фигурных скобочках напишем код нашего колбэка. Для начала извлечем данные запроса и в случае ошибки отправим с сервера ответ, что мы не смогли сохранить данные и статус 500:

http.post('/fakeServer/products', async ({ request }) => { const data = await request.json() if (data.content === 'error') { await delay(ARTIFICIAL_DELAY_MS) return new HttpResponse('server save error', { status: 500, headers: { 'Content-Type': 'application/json', }, }) } })

Если с данными все в порядке, то мы в базе данных найдем продавца по id, который нам пришел в запросе и впишем этого продавца в data (данные продавца ведь у нас тоже хранятся на сервере ;) ):

const seller = db.seller.findFirst({ where: { id: { equals: data.seller } }, }) data.seller = seller

Далее в базе данных создадим для этого продукта объект с реакциями. И теперь, имея все необходимые поля для продукта, создадим в базе и сам продукт:

data.reactions = db.reaction.create() const product = db.product.create(data)

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

await delay(ARTIFICIAL_DELAY_MS) return HttpResponse.json(serializeProduct(product))

На этом мы полностью закончили с сервером и больше к нему не вернемся.

Кстати, еще одна полезная вещь. После строчки export const worker = setupWorker(...handlers) вы можете добавить следующий код:

worker.listHandlers().forEach((handler) => { console.log(handler.info.header) })

И теперь вы сможете видеть результат срабатывания каждого обработчика в консоли браузера.

Конечно же наш сервер ненастоящий и если мы будем принудительно обновлять страницу в браузере, то все наши новые объекты с продуктами исчезнут.

Откройте ваше приложение со студентами. Откройте в нем файл server.js. Добавьте в массив handlers бработку POST-запроса. В теле этого запроса вы будете принимать данные нового добавленного студента.

В теле callback для вашего http.post распакуйте данные и в случае ошибки отправьте соответствующий ответ.

Если же все ок, то найдите в базе данных преподавателя по полученному id и впишите его в данные. Впишите также в данные, созданный на основе базы данных объект votes.

По собранным данным создайте объект student с новым студентом и отошлите его в ответе сервера.



Чат с GPT Компилятор