FSP*_*FSP 5 javascript firebase google-cloud-functions google-cloud-firestore
我从我的 Angular 组件创建了一个可调用函数。我的 angular 组件调用了该createUser函数并成功返回了userRecord值。
但是,我想做的是调用另一个名为createUserRecord. 我不太熟悉承诺以及在这种特定情况下需要返回的内容。
下面是我的两个云函数。我将如何呼吁createUserRecord成功createUser?
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',
})
});
Run Code Online (Sandbox Code Playgroud)
更新
这是我制作的一个版本,我将这两个功能合并在一起。这确实产生了创建和帐户然后写入 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);
});
});
Run Code Online (Sandbox Code Playgroud)
角度可调用函数
在sanitizedMessage控制台日志将返回undefined。
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);
});
}
Run Code Online (Sandbox Code Playgroud)
如果您想在创建用户时在 Firestore 中创建记录,您可以在独特的云功能中很好地做到这一点。以下代码可以解决这个问题,假设您要写入usersFirestore 集合。
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
});
});
Run Code Online (Sandbox Code Playgroud)
“有什么特别的理由不在 CF 中链接函数吗?” ?
如文档中所述,“云函数可以与特定触发器关联”。您可以通过创建相应的触发器来“链接”Cloud Functions,例如,在一个 CF 中的 Firestore 中创建一个文档(例如可调用函数),这将触发另一个响应 Firestore 触发器的 CF。话虽如此,在大多数情况下,您可以通过链接承诺而不是链接 Cloud Functions 在一个独特的 Cloud Function 中满足很多需求。
最后,我不建议从云函数内部调用 HTTP 云函数,因为(恕我直言)HTTP 云函数更适合由外部使用者调用(我什至不知道这是否可行)。
听听 Firebasers 对此的看法会很有趣!
| 归档时间: |
|
| 查看次数: |
6214 次 |
| 最近记录: |