**在我的crud项目中,管理员在文档和auth中添加用户。正常的sdk会替换当前用户,所以我尝试了admin-sdk,但编写云函数和调用越来越复杂,因为我是firebase的新手。我是从stackoverflow的同事那里得到的,为了方便我修改了它,但似乎不起作用。**
我使用";firebase发球
云功能
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.createUser = functions.firestore
.document('Teamchers/{userId}')
.onCreate(async (snap, context) => {
const userId = context.params.userId;
const newUser = await admin.auth().createUser({
disabled: false,
username: snap.get('UserName'),
email: snap.get('email'),
password: snap.get('password'),
subjectname: snap.get('subjectname')
});
return admin.firestore().collection('Teamchers').doc(userId).delete();
});
称之为
const createUser = firebase.functions().httpsCallable('createUser');
const handleadd = async (e) =>{
e.preventDefault();
try{
createUser({userData: data}).then(result => {
console.log(data);
});
addDoc(collection(db, "Courses" , "Teachers", data.subjectname ), {
...data,
timestamp: serverTimestamp(),
});
alert("Faculty added succesfully")
} catch (e){
console.log(e.message)
}
}
除了coderpolo和Frank提到的潜在拼写错误外,您的代码中还有其他几个错误:
1.JS SDK版本混淆
您似乎混淆了JS SDK V9语法和JS SDK V8语法。
在前端定义可调用云函数如下所示为V8语法:
const createUser = firebase.functions().httpsCallable('createUser');
而执行addDoc(collection(...))
是V9语法。
您必须选择一个版本的JS SDK并统一您的代码(请参阅下面的V9示例,#3(。
2.云函数定义错误
用定义您的功能
exports.createUser = functions.firestore
.document('Teamchers/{userId}')
.onCreate(async (snap, context) => {..})
不是定义可调用云函数的方式。
使用onCreate()
,您定义了一个后台触发的云函数,当在Firestore中创建新文档而不是可调用的CF时,该函数将被触发
您需要对其进行如下调整:
exports.createUser = functions.https.onCall((data, context) => {
try {
// ....
// Return data that can be JSON encoded
} catch (e) {
console.log(e.message)
// !!!! See the doc: https://firebase.google.com/docs/functions/callable#handle_errors
}
});
3.使用wait,因为您的handleadd()
函数是async
这不是严格意义上的错误,但应避免同时使用then()
和async
/await
。
我将按如下方式重构它(V9语法(:
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const createUser = httpsCallable(functions, 'createUser');
const handleadd = async (e) => {
e.preventDefault();
try {
await createUser({ userData: data })
await addDoc(collection(db, "Courses", "Teachers", data.subjectname), {
...data,
timestamp: serverTimestamp(),
});
alert("Faculty added succesfully")
} catch (e) {
console.log(e.message)
}
}