来自 Google Cloud Functions 的实时数据库的原子更新

Atomic update of Realtime Database from Google Cloud Functions

我使用 Google Cloud Functions 创建一个 API 端点供我的用户与实时数据库交互。

我遇到的问题是我不确定代码是如何工作的。我有一个只需要调用一次的辅助函数 doSomething,但我怀疑在某些情况下它可以被调用两次或更多次(当多个用户同时调用 API时间和数据库尚未处理更新操作)。可能吗?这是否意味着我需要使用 transaction 方法?谢谢!


数据库结构

{
  somePath: {
    someSubPath: null
  }
}

Google 云函数代码

const functions = require('firebase-functions')
const admin = require('firebase-admin')
const cors = require('cors')({origin: true});
admin.initializeApp(functions.config().firebase)

// API ENDPOINT
exports.test = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    admin.database().ref('/somePath/someSubPath').once('value')
      .then(snapshot => {
        const value = snapshot.val()
        if (value) return res.status(400).send({ message: 'doSomethingAlreadyCalled' })
        doSomething()
        const updates = { '/somePath/someSubPath': true }
        return admin.database().ref().update(updates)
          .then(() => res.status(200).send({ message: 'OK' }))
      })
      .catch(error => res.status(400).send({ message: 'updateError' }))
  })

})

// HELPERS
const doSomething = () => {
  // needs to be called only once
}

我认为您之所以被否决,是因为上述伪代码没有完全意义,并且没有记录或输出您的代码在您的问题中实际执行的操作。由于没有完整的图片,我们很难为您提供帮助。

从问题中的结构来看,由于函数提升,您的实际代码可能会调用两次。每当我遇到这个问题时,我都会返回 api 文档并尝试通过重新阅读来重构我的代码。

HTH