利用 DataLoader 批量鉴权:N+1权限检查优化
将用户权限检查合并为批量操作,避免每行数据独立查询。 · 难度:入门 · +10XP
批量权限加载器
传统DataLoader用于数据库批量查询,但同样适用于权限验证。本教程创建PermissionLoader,将多个字段的权限检查合并为一次数据库查询(如SELECT * FROM permissions WHERE userId IN (...) AND resourceId IN (...)),大幅减少认证查询次数。同时处理角色继承、缓存与过期。
const permissionLoader = new DataLoader(async (keys) => {
const [userId, resourceIds] = keys[0];
const permissions = await db.query(
'SELECT resource_id, level FROM permissions WHERE user_id = $1 AND resource_id = ANY($2)',
[userId, resourceIds]
);
return resourceIds.map(id => permissions.find(p => p.resource_id === id) || null);
});
// 在解析器中使用
const allowed = await permissionLoader.load([userId, resource.id]);