我正在编写一个异步函数async_create_user
,用于create_user
中形式的Firebase HTTPS函数index.js
。
index.js
exports.create_user = functions.https.onCall(async_create_user);
我正在像这样在单个文件user.js
中测试它们,然后运行node user.js
该代码具有在数据库中创建User文档的预期行为,但是我对该功能的意图还在于终止,以便我可以使用一系列其他功能对其进行测试。我可以知道是否有一种实现方法可以终止它。
const { admin, db } = require("../util/admin");
//const db = admin.firestore();
//const admin = require('firebase-admin');
//admin.initializeApp(config);
const config = require("../util/config");
const { uuid } = require("uuidv4");
const {
success_response,
error_response
} = require("../util/validators");
const firebase = require("firebase");
firebase.initializeApp(config);
const {
validateSignupData,
validateLoginData,
reduceUserDetails,
} = require("../util/validators");
exports.async_create_user = async function(data, context) {
// Perform Authentication Checks
try {
const userRecord = await admin.auth().createUser({
displayName: data.displayName,
email: data.email,
emailVerified: true,
password: data.password,
disabled: false
});
await admin.auth().setCustomUserClaims(userRecord.uid, {user_basic: true})
//data required for the personal?
const PrivateUser = {
display_name: data.displayName,
email: data.email,
notification_ids: [],
saved_posts: [],
last_updated: admin.firestore.FieldValue.serverTimestamp()
};
const noImg = "no-img.png";
//sets default profile image to be the empty image
const PublicUser = {
profile_image:
{
url: "some url",
uid: userRecord.uid
}
}
await db
.collection("users_private")
.doc(userRecord.uid)
.set(PrivateUser);
await db
.collection("users_public")
.doc(userRecord.uid)
.set(PublicUser);
console.log(userRecord.uid);
return success_response();
} catch (error) {
console.log("Error in creation of user account", error);
return error_response(error);
}
}
const mockUser = {
displayName: "Mallory",
email: "mallory@example.org",
password: "123456",
disabled: false,
emailVerified: true
}
exports.async_create_user(mockUser);
答案 0 :(得分:-1)
我写了一个名为rubico的库,该库消除了Promises周围的许多杂物。结果是更简单的代码; rubico处理异步终止,因此您不必这样做。
const { pipe, fork, get, tap, tryCatch } = require('rubico')
const setCustomUserClaims = uid =>
admin.auth().setCustomUserClaims(uid, { user_basic: true })
const getServerTimestamp = () => admin.firestore.FieldValue.serverTimestamp()
const createPrivateUser = ({ uid, PrivateUser }) =>
db.collection('users_private').doc(uid).set(PrivateUser)
const createPublicUser = ({ uid, PublicUser }) =>
db.collection('users_public').doc(uid).set(PrivateUser)
const createUser = pipe([
fork({
displayName: get('displayName'), // input => input.displayName
email: get('email'), // input => input.email
emailVerified: () => true, // () => true
password: get('password'), // input => input.password
disabled: () => false, // () => false
}), // { displayName, email, password } => { displayName, email, emailVerified, password, disabled } === userPreRecord
admin.auth().createUser, // userPreRecord => userRecord
tap(pipe([get('uid'), setCustomUserClaims])), // setCustomUserClaims with uid but don't care about the return
fork({
uid: get('uid'), // userRecord => userRecord.uid
PrivateUser: fork({
display_name: get('displayName'), // userRecord => userRecord.displayName
email: get('email'), // userRecord => userRecord.email
notification_ids: () => [],
saved_posts: () => [],
last_updated: getServerTimestamp,
}),
PublicUser: fork({
profile_image: fork({
url: () => 'no-img.png',
uid: get('uid'), // userRecord => userRecord.uid
}),
}),
}),
tap(fork([ // tap: run input through the following fork of functions and discard return.
createPrivateUser, // userRecord => createPrivateUser(userRecord)
createPublicUser, // userRecord => createPublicUser(userRecord)
])),
])
exports.async_create_user = tryCatch( // try pipe([createUser, success_response]), catch with err => {...}
pipe([createUser, success_response]),
err => {
console.log("Error in creation of user account", err);
error_response(err);
},
)