Gestione della richiesta POST inviata utilizzando thunk in Redux

Abbiamo ottenuto i dati dei prodotti e dei venditori dal server e li abbiamo visualizzati nell'applicazione. Ma con thunk è possibile non solo ricevere, ma anche inviare dati. Scopriamo come farlo.

Dopo aver aggiunto un nuovo prodotto, rimane nel nostro store, cioè all'interno della nostra applicazione. Facciamo in modo che il nuovo prodotto venga salvato sul server.

Iniziamo dal server. Qui dovremo gestire non una GET, ma una richiesta POST, poiché al server arriveranno ora i dati del prodotto che andremo a salvare.

Apriamo la nostra applicazione con i prodotti, e in essa il file server.js. Troviamo l'array handlers e aggiungiamoci un altro gestore per la richiesta POST. Qui dovremo accettare anche il corpo della richiesta, quindi nel callback dobbiamo passare request:

api/server.jshttp.post('/fakeServer/products', async ({ request }) => {})

Ora tra le parentesi graffe scriviamo il codice del nostro callback. Per cominciare, estraiamo i dati della richiesta e in caso di errore inviamo dal server una risposta che non siamo riusciti a salvare i dati e lo status 500:

api/server.jshttp.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',
      },
    })
  }
})

Se i dati sono a posto, allora nel database troveremo il venditore per id, che ci è arrivato nella richiesta e scriveremo questo venditore in data (anche i dati del venditore dopotutto sono memorizzati sul server ;) ):

api/server.jsconst seller = db.seller.findFirst({
  where: { id: { equals: data.seller } },
})
data.seller = seller

Successivamente nel database creeremo per questo prodotto un oggetto con le reazioni. E ora, avendo tutti i campi necessari per il prodotto, creiamo nel database il prodotto stesso:

api/server.jsdata.reactions = db.reaction.create()
const product = db.product.create(data)

Impostiamo un ritardo e nell'ultima riga di codice per il nostro callback restituiamo la risposta con il prodotto:

api/server.jsawait delay(ARTIFICIAL_DELAY_MS)
return HttpResponse.json(serializeProduct(product))

Con questo abbiamo completamente finito con il server e non ci torneremo più.

A proposito, un'altra cosa utile. Dopo la riga export const worker = setupWorker(...handlers) puoi aggiungere il seguente codice:

api/server.jsworker.listHandlers().forEach((handler) => {
  console.log(handler.info.header)
})

E ora potrai vedere il risultato dell'attivazione di ogni gestore nella console del browser.

Naturalmente il nostro server non è reale e se aggiorniamo forzatamente la pagina nel browser, tutti i nostri nuovi oggetti prodotto scompariranno.

Задание 1

Apri la tua applicazione con gli studenti. Apri in essa il file server.js. Aggiungi nell'array handlers la gestione della richiesta POST. Nel corpo di questa richiesta accetterai i dati del nuovo studente aggiunto.

Задание 2

Nel corpo del callback per il tuo http.post estrai i dati e in caso di errore invia una risposta appropriata.

Задание 3

Se invece tutto ok, allora trova nel database il docente in base all'id ricevuto e scrivilo nei dati. Scrivi anche nei dati, un oggetto votes creato basandosi sul database.

Задание 4

Con i dati raccolti crea un oggetto student con il nuovo studente e invialo nella risposta del server.