我写的是nestjs/mongodb,写的是reactjs。在它们之间使用了graphql。我在头文件中有一些需要的信息,或者在查询中通过变量传递。
通过变量传递还是通过上下文传递更便宜?
当用户登录时,我正在设置标题:亲子关系
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem(${localStorageAppPrefix}.token`);
return {
headers: {
...headers,
filialIds: `${localStorage.getItem(`${localStorageAppPrefix}.filialIds`) ?? ''}`,
authorization: token ? `Bearer ${token}` : '',
},
};
});
export const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});`
当用户查询smth时,我会检查他的子公司ID和在Guard中的角色
@Injectable() export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const ctx = GqlExecutionContext.create(context);
const requiredRoles = this.reflector.getAllAndOverride<UserRoles[]>(
ROLES_KEY,
[context.getHandler(), context.getClass()],
);
if (!requiredRoles) {
return true;
}
const queryFilialIds =
safeJSONParse(ctx.getContext()?.req?.headers?.filialids ?? '') ?? [];
const { roles, filialIds } = ctx.getContext()?.req?.user ?? {};
const hasRequiredFilials = filialIds?.every(
(filialId) => queryFilialIds.indexOf(filialId) !== -1,
);
const hasRequiredRoles = requiredRoles.some(
(role) => roles?.indexOf(role) !== -1,
);
return hasRequiredRoles || hasRequiredFilials;
}
}`
但我还需要访问子公司ID和服务角色,如下所示:
async getCount(context): Promise<number> {
const filialIds =
JSON.parse(context?.req?.headers?.filialids ?? '') ?? [];
return this.userModel.countDocuments({ filialIds: { $in: filialIds } });
}
所以问题是:我应该使用上下文还是从graphql查询传递它,如下所示:
const { data } = useQuery(GET_USER, {
variables: { filialIds: filialIds ?? [] },
skip: !filialIds?.length,
});
1条答案
按热度按时间fafcakar1#
有很多方法可以解决这个问题,我假设
filialIds
是某种 affiliation id?1.如果附属ID是 user 的属性,则可以将其包含在JWT标记中,或者在检查JWT时将其附加到用户对象。此外,如果它是用户属性,则根本不需要将其从客户机发送到服务器。
1.如果在多租户情况下,affiliation id是 site 的属性,那么标头就非常有意义--不过,一个站点可能欺骗另一个站点
1.如果您的大多数或许多解析器需要这个变量,那么将它作为查询变量似乎很乏味。