6 votes

Comment incrémenter une valeur dans faunadb ? Utilisation de javascript et de fonctions côté serveur

J'ai une valeur dans ma base de données faunadb que je veux augmenter d'une unité lorsque je clique sur un bouton.
Je ne suis pas sûr de savoir comment faire

J'ai essayé avec ça :

const change = (data) => {
  return fetch(`/.netlify/functions/todos-update`, {
    body: JSON.stringify(data),
    method: 'POST'
  }).then(response => {
    return response.json()
  })
}

et l'a déclenché avec ceci

var dataa = document.getElementById('amount').innerHTML
change(("value: " + dataa))

mon code côté serveur est le suivant :

exports.handler = (event, context, callback) => {
  const data = JSON.parse(event.body)
  const id = "236323245287014920"
  console.log(`Function 'todo-update' invoked. update id: ${id}`)
  return client.query(q.Update(q.Ref(`classes/nappi/${id}`), {data}))
    .then((response) => {
      console.log('success', response)
      return callback(null, {
        statusCode: 200,
        body: JSON.stringify(response)
      })
    }).catch((error) => {
      console.log('error', error)
      return callback(null, {
        statusCode: 400,
        body: JSON.stringify(error)
      })
    })
}

Je m'attendais à ce que cela incrémente ma valeur dans la base de données de 1, mais en réalité, j'obtiens une erreur qui ressemble à ceci : POST https://nappula.tk/.netlify/functions/todos-update 400 (Bad Request)
Je ne sais pas où je me suis trompé.

12voto

JimTheDev Points 434

Pour les applications non triviales, il ne faut pas compter sur des allers-retours vers le monde JavaScript (ou tout autre langage qui ne soit pas de niveau BD) pour l'incrémentation. Ce n'est pas sûr car quelqu'un d'autre peut incrémenter au même moment et vous pourriez écraser son incrément si votre réseau est plus lent. Seule la base de données sera en mesure de savoir s'il faut verrouiller ou non dans cette situation.

Voici un exemple : si le nombre de clics initial d'un sujet est de 1, et qu'au même moment, vous et moi augmentons ce nombre, la base de données doit savoir que le nombre réel devrait être de 3 et non de 2. Vous devriez avoir une fonction d'incrémentation dans votre FaunaDB pour vous assurer qu'elle peut se bloquer si nécessaire afin de garantir que le compte de clics correct est appliqué.

Supposons que vous ayez une collection appelée sujets avec quelques documents qui ressemblent à ceci :

sujet document #id 254119747652682260

{ slug: "dev", clickCount: 1 }

sujet document #id 254119747652122323

{ slug: "design", clickCount: 1 }

Comment faire pour incrémenter en toute sécurité le champ clickedCount de 1 à 2, sur un document dont l'id est 254119747652682260, dans la collection topics ?

Update(
    Ref(
        Collection('topics'),
        '254119747652682260'
    ),
    { 
        data: { 
            clickCount: Add(
                Select(
                    ['data','clickCount'],
                    Get(
                        Ref(
                            Collection('topics'),
                            '254119747652682260'
                        )
                    )
                ),
                1
            )
        }
    }
)

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X