使用 Firebase Admin SDK (NodeJS) 将数据导入 Firestore 并不适用于所有集合
Import data to Firestore with Firebase Admin SDK (NodeJS) doesn't work for all collections
我正在使用 Firestore 作为我的 React 网络应用程序的数据库。在使用 cypress 进行浏览器测试之前 运行,我执行了一个 NodeJS 脚本,该脚本导入了这些测试所需的数据。我的 Firebase 计划设置为 Blaze(即用即付),因为免费版本不支持导入。
我有 3 个集合,我在其中导入数据 - 组织、配置文件、产品。 使用相同的代码,导入适用于组织和个人资料,但不适用于产品:
const admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: `https://<myFirebaseProjectId>.firebaseio.com`
});
const testOrg = {
name: "testOrgName",
createdAt: Date()
};
//add organization
admin.firestore().collection("organizations").add(testOrg)
.then(createdTestOrg => {
//works fine with organizations
console.log("Successfully created new org:", createdTestOrg.id);
const testProfile = {
name: "testProfile",
organization: admin.firestore().doc(`organizations/${createdTestOrg.id}`)
createdAt: Date()
};
//add profiles
admin.firestore().collection("profiles").add(testprofile)
.then(createdTestProfile => {
//works fine with profile
console.log("Successfully created new profile:", createdTestProfile .id);
let productItem = {
isDeleted: false,
createdBy: admin.firestore().doc('profiles/' + selectedUser[0].uid),
createdAt: Date()
};
productItem.name = makeRandomName(10)
//add product
admin.firestore().collection("products").add(productItem)
.then((newProd)=>{
// I never get here
console.log("Successfully created test product");
})
.catch(error => {
// I never get here either
// eslint-disable-next-line no-console
console.log("Error creating test product:", error);
process.exit(1);
});
});
});
这是包含完整代码的 Gist:https://gist.github.com/DurkoMatko/1097d1c18a00d5fd4195253205c53ff2
我也试过用 collection("products").doc(product.id).set(product)
替换 collection("products").add(product)
,如果它不存在,应该创建新文档。仍然没有成功。此外,.then
和 .catch
部分中的断点都不会触发。这些行只是默默地发生,但不会创建新产品文档。
有人知道吗?
好的,我通过直接创建产品作为 .add
函数的参数而不是在将其传递给 .add
之前将其存储为 const
变量来解决这个问题。我不知道为什么会这样,而我在问题中发布的代码却没有。希望对以后的人有帮助。
admin
.firestore()
.collection("products")
.add({
name: "BrowserTestProduct26",
createdAt: Date.now(),
createdBy: admin.firestore().doc(`profiles/${userRecord.uid}`),
isDeleted: false,
category: categories[Math.floor(Math.random() * categories.length)]
})
.then(createdProduct => {
console.log("Successfully created new product:", createdProduct.id);
})
.catch(error => {
console.log("Error creating test product:", error);
process.exit(1);
});
我正在使用 Firestore 作为我的 React 网络应用程序的数据库。在使用 cypress 进行浏览器测试之前 运行,我执行了一个 NodeJS 脚本,该脚本导入了这些测试所需的数据。我的 Firebase 计划设置为 Blaze(即用即付),因为免费版本不支持导入。
我有 3 个集合,我在其中导入数据 - 组织、配置文件、产品。 使用相同的代码,导入适用于组织和个人资料,但不适用于产品:
const admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: `https://<myFirebaseProjectId>.firebaseio.com`
});
const testOrg = {
name: "testOrgName",
createdAt: Date()
};
//add organization
admin.firestore().collection("organizations").add(testOrg)
.then(createdTestOrg => {
//works fine with organizations
console.log("Successfully created new org:", createdTestOrg.id);
const testProfile = {
name: "testProfile",
organization: admin.firestore().doc(`organizations/${createdTestOrg.id}`)
createdAt: Date()
};
//add profiles
admin.firestore().collection("profiles").add(testprofile)
.then(createdTestProfile => {
//works fine with profile
console.log("Successfully created new profile:", createdTestProfile .id);
let productItem = {
isDeleted: false,
createdBy: admin.firestore().doc('profiles/' + selectedUser[0].uid),
createdAt: Date()
};
productItem.name = makeRandomName(10)
//add product
admin.firestore().collection("products").add(productItem)
.then((newProd)=>{
// I never get here
console.log("Successfully created test product");
})
.catch(error => {
// I never get here either
// eslint-disable-next-line no-console
console.log("Error creating test product:", error);
process.exit(1);
});
});
});
这是包含完整代码的 Gist:https://gist.github.com/DurkoMatko/1097d1c18a00d5fd4195253205c53ff2
我也试过用 collection("products").doc(product.id).set(product)
替换 collection("products").add(product)
,如果它不存在,应该创建新文档。仍然没有成功。此外,.then
和 .catch
部分中的断点都不会触发。这些行只是默默地发生,但不会创建新产品文档。
有人知道吗?
好的,我通过直接创建产品作为 .add
函数的参数而不是在将其传递给 .add
之前将其存储为 const
变量来解决这个问题。我不知道为什么会这样,而我在问题中发布的代码却没有。希望对以后的人有帮助。
admin
.firestore()
.collection("products")
.add({
name: "BrowserTestProduct26",
createdAt: Date.now(),
createdBy: admin.firestore().doc(`profiles/${userRecord.uid}`),
isDeleted: false,
category: categories[Math.floor(Math.random() * categories.length)]
})
.then(createdProduct => {
console.log("Successfully created new product:", createdProduct.id);
})
.catch(error => {
console.log("Error creating test product:", error);
process.exit(1);
});