我想在前端设置我的文档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)
编辑: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
}
抱歉,回复晚了:/希望这有帮助!
另一种选择是:
安装@google-cloud/firestore
npm install @google-cloud/firestore
然后在需要的时候导入并使用
autoId
:
import {autoId} from "@google-cloud/firestore/build/src/util";
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
您想添加具有唯一 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);
我找不到如何从 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;
}
基于 webcrypto 的解决方案,不需要任何 polyfill:
function firestoreId() {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
return Array.from(crypto.getRandomValues(new Uint8Array(20))).map(b => chars[b % chars.length]).join('')
}