![](/img/trans.png)
[英]`httpsCallable` vs. `httpsCallableFromURL` callable Firebase Functions
[英]Is it possible to specify input and return types for httpsCallable functions?
我在应用程序中使用可调用的 function 来更新用户声明。 firebase 函数在 Typescript 中,并且有一个接口来描述 function 所需的数据形状。
我想在客户端做同样的事情,这样团队中的任何开发人员都可以快速找出对云 function 的要求,而无需查看函数目录中的代码。
functions/src/index.ts
:
// This is the required data, that I would like to specify client side
interface GivePermissionsParams {
uid: string;
email: string;
newClaim: Partial<Permissions>;
}
/**
* Callable function to give a user new permissions in the form
* of custom claims and firestore properties
*/
exports.givePermission = functions.https.onCall(
async (data: GivePermissionsParams, context) => {
if (!context.auth?.token.admin) {
throw new HttpsError(
'permission-denied',
`Non admin user ${context.auth?.uid} attempted to update permissions`
);
}
return grantPermission(data.uid, data.newClaim).then(() => {
log(`Successfully updated permissions for ${data.email}`);
return {
result: `Successfully updated permissions for ${data.email}`,
};
});
}
);
客户端使用:
// firebase.ts
// I would like to specify the function param and return types here.
// eg: httpsCallable<myParamsType, myReturnType>
export const givePermission = httpsCallable(functions, 'givePermission');
// in my reactComponent.tsx
const changePermission = async (permission: string, value: boolean) => {
// This payload should match the GivePermissionsParams type as defined in the functions index.ts file.
const functionParams = {
uid: user.uid,
email: user.email,
newClaim: {[permission]: value}
}
const functionRes = await givePermission(functionParams);
};
看来解决方案就是您正在尝试做的事情。 您可以为请求数据和响应指定类型,如下所示:
interface ReqInterface {
uid: string;
email: string;
newClaim: Partial<Permissions>;
}
interface ResInterface {
result: string;
}
const givePermission = httpsCallable<ReqInterface, ResInterface>(functions, 'givePermission')
const { data } = await givePermission({ url })
// data is ResInterface
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.