在前端访问 Firestore ID 生成器

问题描述 投票:0回答:6

我想在前端设置我的文档ID,同时我

set
文档,所以我想知道是否有一种方法可以生成Firestore ID,它可能看起来像这样:

const theID = firebase.firestore().generateID() // something like this

firebase.firestore().collection('posts').doc(theID).set({
    id: theID,
    ...otherData
})

我可以使用

uuid
或其他一些 id 生成器包,但我正在寻找 Firestore id 生成器。 这个SO答案指向一些newId方法,但我在JS SDK中找不到它......(https://www.npmjs.com/package/firebase

javascript firebase google-cloud-firestore
6个回答
23
投票

编辑:Chris Fischer的答案是最新的,并且使用

crypto
生成随机字节可能更安全(尽管您可能会在非节点环境中尝试使用
crypto
遇到麻烦,例如React Native) .

原答案:

在 RN Firebase 不和谐聊天中询问后,我被指出了 this util function 位于react-native-firebase 库深处。它本质上与我在问题中提到的 SO 答案所指的功能相同(请参阅 firebase-js-sdk here 中的代码)。

根据您在 Firebase 周围使用的包装器,ID 生成实用程序不一定是导出/可访问的。所以我只是将它作为 util 函数复制到我的项目中:

export const firestoreAutoId = (): string => {
  const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

  let autoId = ''

  for (let i = 0; i < 20; i++) {
    autoId += CHARS.charAt(
      Math.floor(Math.random() * CHARS.length)
    )
  }
  return autoId
}

抱歉,回复晚了:/希望这有帮助!


6
投票

另一种选择是:

  1. 安装@google-cloud/firestore

    npm install @google-cloud/firestore

  2. 然后在需要的时候导入并使用

    autoId

import {autoId} from "@google-cloud/firestore/build/src/util";

5
投票
import {randomBytes} from 'crypto';

export function autoId(): string {
  const chars =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let autoId = '';
  while (autoId.length < 20) {
    const bytes = randomBytes(40);
    bytes.forEach(b => {
      // Length of `chars` is 62. We only take bytes between 0 and 62*4-1
      // (both inclusive). The value is then evenly mapped to indices of `char`
      // via a modulo operation.
      const maxValue = 62 * 4 - 1;
      if (autoId.length < 20 && b <= maxValue) {
        autoId += chars.charAt(b % 62);
      }
    });
  }
  return autoId;
}

取自 Firestore Node.js SDK: https://github.com/googleapis/nodejs-firestore/blob/4f4574afaa8cf817d06b5965492791c2eff01ed5/dev/src/util.ts#L52


2
投票

您想添加具有唯一 ID 的新文档吗?

请参阅 https://firebase.google.com/docs/firestore/manage-data/add-data#add_a_document .

有时文档没有有意义的 ID,让 Cloud Firestore 自动为您生成 ID 会更方便。您可以通过调用 add() 来完成此操作

在某些情况下,使用自动生成的 ID 创建文档引用然后在以后使用该引用可能会很有用。对于这个用例,您可以调用 doc()

在幕后,.add(...) 和 .doc().set(...) 是完全等价的,所以你可以使用更方便的那个。

添加()

    // Add a new document with a generated id.
    db.collection("cities").add({
        name: "Tokyo",
        country: "Japan"
    })
    .then(function(docRef) {
        console.log("Document written with ID: ", docRef.id);
    })
    .catch(function(error) {
        console.error("Error adding document: ", error);
    });test.firestore.js

文档()

    // Add a new document with a generated id.
    var newCityRef = db.collection("cities").doc();
    // later...
    newCityRef.set(data);

1
投票

我找不到如何从 firestore 库访问 AutoId.newId() 。 但是,实际上有一种更安全的方法可以从浏览器中的 window.crypto 库获取 ID(TypeScript 中的代码示例 - 只需删除 JS 的类型)。

// Use crypto api to generate random string of given length (in bytes)
// Note that characters are hex bytes - so string is twice as long as
// requested length - but has 8 * bytes bits of entropy.
function generateId(bytes: number): string {
    let result = "";
    // Can't use map as it returns another Uint8Array instead of array
    // of strings.
    for (let byte of crypto.getRandomValues(new Uint8Array(bytes))) {
        result += byte.toString(16);
    }
    return result;
}

0
投票

基于 webcrypto 的解决方案,不需要任何 polyfill:

function firestoreId() {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    return Array.from(crypto.getRandomValues(new Uint8Array(20))).map(b => chars[b % chars.length]).join('')
}
© www.soinside.com 2019 - 2024. All rights reserved.