6

我的动物区数据库中有一个值,我想在单击按钮时将其加一。
我不知道该怎么做


我用这个试过:

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


并以此触发它

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

我的服务器端代码是这样的:

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)
      })
    })
}

我希望这会使我在数据库中的值增加 1,但实际上我得到一个看起来像这样的错误:POST https://nappula.tk/.netlify/functions/todos-update 400 (Bad Request)
我不确定我哪里出错了

4

1 回答 1

12

对于非平凡的应用程序,您不应该依赖在 JavaScript 领域(或任何其他非数据库级语言)来回增加。这是不安全的,因为其他人基本上可以同时递增,然后如果您的网络碰巧较慢,您可能会覆盖他们的递增。在这种情况下,只有数据库才能知道是否锁定。

这是一个例子,如果一个主题的初始点击计数是 1,那么在你和我同时增加该计数的同时,数据库必须知道实际计数应该是 3 而不是 2。你应该有一个增量FaunaDB 中的函数,以确保它可以根据需要阻止,以确保应用正确的 clickCount。

假设您有一个名为 topic 的集合,其中包含一些如下所示的文档:

主题文档#id 254119747652682260

{ slug: "dev", clickCount: 1 }

主题文档#id 254119747652122323

{ slug: "design", clickCount: 1 }

那么,如何在主题集合中 ID 为 254119747652682260 的文档上安全地将 clickedCount 字段从 1 增加到 2?

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

希望这会有所帮助。

于 2020-01-10T19:46:55.617 回答