我想在Firestore中创建用户数据(名称,电子邮件,电话号码)。这应该在创建经过身份验证的用户时触发。
在functions
-> src
-> index.ts
// Sends email to user after signup
export { welcomeEmail } from './send_email';
// Saves user after signup
export { createUserDoc } from './save_user';
在functions
-> src
-> save_user.ts
// Firebase Config
import * as functions from "firebase-functions";
import * as firebase from "firebase-admin";
import {MD5} from "crypto-js";
export const createUserDoc = functions.auth.user().onCreate(event => {
const firebaseUser = event.data;
// Use gravatar as default if photoUrl isn't specified in user data
let fileEnding = "jpg";
let photoURL = `https://www.gravatar.com/avatar/${MD5(firebaseUser.email).toString().toLowerCase()}.jpg?s=1024&d=robohash`;
if (firebaseUser.photoURL) {
fileEnding = firebaseUser.photoURL.substr(firebaseUser.photoURL.lastIndexOf(".") + 1);
photoURL = firebaseUser.photoURL;
}
const fileName = `users/${firebaseUser.uid}/profile.${fileEnding}`;
const profilePhotoStorageOpts = {
destination: fileName,
metadata: {
contentType: `image/${fileEnding}`
}
};
const user = {
name: firebaseUser.displayName || "No Name",
email: firebaseUser.email,
photoUrl: `gs://${firebase.storage().bucket().name}/${fileName}`
};
return Promise.all([
firebase.storage().bucket().upload(photoURL, profilePhotoStorageOpts),
firebase.firestore().collection("users").doc(firebaseUser.uid).set(user)
]);
});
目标是,对于每个创建的帐户,我现在都将在Firestore中找到一个相应的用户文档,并在云存储中找到一个个人资料图片。
相反,我得到:
“用户记录”类型上不存在属性“数据”。ts(2339)
'Promise'仅指类型,但在此处被用作值。您是否需要更改目标库?尝试将lib
编译器选项更改为es2015或更高版本。ts(2585)
我们将不胜感激。谢谢
答案 0 :(得分:2)
正如您将在documentation中的onCreate
方法中看到的那样,处理程序函数的第一个参数是一个UserRecord
,它没有data
属性。 / p>
因此,您遇到的第一个错误是正常的。
在您的情况下,例如,如果要获取用户的photoURL
,则应执行event.photoURL
(因为event
的类型为UserRecord
)。同样,您将执行event.uid
来获取用户的uid。
对于第二个错误,您可以看看https://stackoverflow.com/a/43122423/3371862或How to resolve 'Build:'Promise' only refers to a type, but is being used as a value here.'