【问题标题】:Graphql: which is better to use variables or headersGraphql:使用变量或标头哪个更好
【发布时间】:2023-01-27 00:51:56
【问题描述】:

我在 nestjs/mongodb 上回写,在 reactjs 上回写。并在它们之间使用 graphql。我在标题中有一些需要的信息,或者我通过查询中的变量传递了它。

通过变量或通过上下文传递它更便宜吗?

当用户登录时,我正在设置标题:filialIds

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 时,我正在检查他的 filialIds 和在 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;
    }
}`

但我还需要访问 filialIds 和服务中的角色,如下所示:

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,
});

【问题讨论】:

    标签: reactjs graphql nestjs


    【解决方案1】:

    有很多方法可以解决这个问题。我认为 filialIds 是某种隶属关系编号

    1. 如果从属关系 ID 是用户那么您可以将它包含在您的 JWT 令牌中,或者在您检查 JWT 时将它附加到用户对象。
    2. 如果从属关系 ID 是地点在多租户的情况下,标头非常有意义——但是一个站点可能不会欺骗另一个站点
    3. 如果您的大多数或许多解析器需要此变量,那么将其作为查询变量似乎很乏味。

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2011-04-09
      • 2015-11-03
      相关资源
      最近更新 更多