来自 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
我使用 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