reactjs Graphql:使用变量和头文件哪个更好

cwtwac6a  于 2023-01-30  发布在  React
关注(0)|答案(1)|浏览(208)

我写的是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,
});
fafcakar

fafcakar1#

有很多方法可以解决这个问题,我假设filialIds是某种 affiliation id
1.如果附属ID是 user 的属性,则可以将其包含在JWT标记中,或者在检查JWT时将其附加到用户对象。此外,如果它是用户属性,则根本不需要将其从客户机发送到服务器。
1.如果在多租户情况下,affiliation id是 site 的属性,那么标头就非常有意义--不过,一个站点可能欺骗另一个站点
1.如果您的大多数或许多解析器需要这个变量,那么将它作为查询变量似乎很乏味。

相关问题