Javascript Firebase云函数-如何调用另一个函数并返回对象
我用角度分量创建了一个可调用的函数。我的角度组件调用Javascript Firebase云函数-如何调用另一个函数并返回对象,javascript,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,我用角度分量创建了一个可调用的函数。我的角度组件调用createUser函数并成功返回userRecord值 然而,我想做的是调用另一个名为createUserRecord的云函数。我不太熟悉承诺,也不太熟悉在这个特定场景中需要返回的内容 下面是我的两个云函数。如果createUser成功,我将如何调用createUserRecord export const createUser = functions.https.onCall(async (data, context) => {
createUser
函数并成功返回userRecord
值
然而,我想做的是调用另一个名为createUserRecord
的云函数。我不太熟悉承诺,也不太熟悉在这个特定场景中需要返回的内容
下面是我的两个云函数。如果createUser
成功,我将如何调用createUserRecord
export const createUser = functions.https.onCall(async (data, context) => {
console.log('data = ', data);
return admin.auth().createUser({
email: data.email,
password: data.password,
}).then(function (userRecord) {
return userRecord
})
.catch(function (error) {
return error;
console.log('Error creating new user:', error);
});
});
export const createUserRecord = functions.auth.user().onCreate((user, context) => {
const userRef = db.doc(`users/${user.uid}`);
return userRef.set({
email: user.displayName,
createdAt: context.timestamp,
nickname: 'bubba',
})
});
更新
这是我制作的一个版本,我将两个函数合并在一起。这确实会产生创建帐户并写入firestore的预期结果。但是,它确实感觉有点“关闭”,因为它不会向客户端返回值
export const createUser = functions.https.onCall(async (data, context) => {
console.log('data = ', data);
return admin.auth().createUser({
email: data.email,
password: data.password,
}).then(function (userRecord) {
const userRef = db.doc(`users/${userRecord.uid}`);
return userRef.set({
email: data.email,
name: data.name,
})
})
.catch(function (error) {
return error;
console.log('Error creating new user:', error);
});
});
角度可调用函数
sanitizedMessage
控制台日志将返回未定义的
addUser() {
const createUser = firebase.functions().httpsCallable('createUser');
const uniquePassword = this.afs.createId();
createUser({
email: this.userForm.value.email,
password: uniquePassword,
name: this.userForm.value.name,
}).then((result) => {
// Read result of the Cloud Function.
var sanitizedMessage = result.data.text;
console.log('sanitizedMessage = ', sanitizedMessage);
}).catch((error) => {
var code = error.code;
var message = error.message;
var details = error.details;
console.log('error = ', error);
});
}
如果您想在用户创建时在Firestore中创建一条记录,您可以在一个独特的云函数中很好地实现这一点。下面的代码将实现这一技巧,假设您希望向
用户
Firestore集合进行写入
const FieldValue = require('firebase-admin').firestore.FieldValue;
...
export const createUser = functions.https.onCall((data, context) => {
console.log('data = ', data);
return admin
.auth()
.createUser({
email: data.email,
password: data.password
})
.then(userRecord => {
return admin.firestore().collection('users')
.doc(userRecord.uid)
.set({
email: userRecord.displayName,
createdAt: FieldValue.serverTimestamp(),
nickname: 'bubba'
});
})
.then(() => {
return {
result: 'Success'
};
})
.catch(error => {
//Look at the documentation for Callable Cloud Functions to adapt this part:
//https://firebase.google.com/docs/functions/callable?authuser=0
});
});
是否有任何特殊原因不在CF中链接功能? 如中所述,“云函数可以与特定触发器相关联”。您可以通过创建相应的触发器来“链接”云函数,例如,在一个CF中的Firestore中创建一个文档(例如,可调用函数),该文档将触发响应Firestore触发器的另一个CF)话虽如此,在大多数情况下,通过链接承诺,而不是链接云功能,您可能可以在独特的云功能中满足许多需求 最后,我不建议从云函数中调用HTTP云函数,因为(IMHO)HTTP云函数更适合由外部使用者调用(我甚至不知道这是否可行)
这将是有趣的有Firebases的意见 您不应该从一个云函数调用另一个云函数。您在这里的确切用户需求是什么?是否要在用户创建时在实时数据库中创建记录?你可以用一个云函数来描述它。嘿@RenaudTarnec-基本上是的,但在这个例子中它是firestore。我已尝试将
返回userRef.set
方法(从createUserRecord
)移动到。然后(函数(userRecord)createUser
函数的
。这是可行的。但它感觉很粗糙。这真的可以接受吗?有什么特别的理由不在CF中链接函数吗?@RenaudTarnec-我在我的代码中添加了一个更新来解释上面的评论。我刚刚发布了一个答案。告诉我它是如何工作的。这是一种享受。至少我接近了w第二次尝试。谢谢你如此精彩的回复!