云函数 HTTPS 触发器生成唯一的用户 ID

Cloud functions HTTPS trigger to generate unique user IDs

对于使用 Firebase 作为数据库的 AppInventor 应用程序,我想为应用程序用户提供唯一的用户 ID。在寻找一些选项后,我想到我可以使用应用程序请求的云 HTTP 函数,返回的数据将是一个 UserId,通过简单地递增 UserId 中的最后一个 UserId 生成=13=] table(也不确定是不是一个)

事情是这样的,但我无法部署以下代码(即使我可以,它也没有像我预期的那样工作)。它正确读取了最后一个UserId,但到目前为止我只能让它覆盖以前的数据。

它在 functions.https 中的 "." 中抛出一个意外的标记错误。

const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

var LastUserId = function f() {return admin.database().ref('UserIds').limitToLast(1)}

exports.addWelcomeMessages = functions.https.onRequest((request, response)) => {
    var ref = admin.database().ref('UserIds');
    // this new, empty ref only exists locally
    var newChildRef = ref.push();
    // we can get its id using key()
    console.log('my new shiny id is '+newChildRef.key());
    // now it is appended at the end of data at the server
    newChildRef.set({User : LastUserId + 1});
});

Firebase 身份验证包已经为每个经过身份验证的用户提供了一个自动生成的唯一 ID,您可以从网络上的 firebase.auth().currentUser.uid 和其他平台的类似方法中获取。

如果您仍想使用 Cloud Functions 生成自己的增量 ID,则需要使用 transaction 然后发回新 ID,例如:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.generateUserId = functions.https.onRequest((req, res) => {
    var ref = admin.database().ref('/lastUserId');
    ref.transaction(function(current) {
      return (current || 0) + 1;
    }, function(error, committed, snapshot) {
      if (error || !committed || !snapshot) {
        console.error("Transaction failed abnormally!", error || "");
      } else {
        console.log("Generated ID: ", snapshot.val());
      }
      res.status(200).send(snapshot.val().toString());
    });
});

这会使用事务增加数据库中的 lastUserId 值,然后将此新 ID 作为响应发回(使用 res.send())以供调用应用程序使用。