flipped-aurora/gin-vue-admin · error

获取菜单列表失败: %w

Error message

获取菜单列表失败: %w

What it means

After the batch-size check, the assigner fetches the full base-menu tree via POST `/menu/getMenuList` to validate IDs, complete parent chains, and build write-back payloads. Any failure of that upstream call is wrapped with this message. Without the menu list no assignment can proceed.

Source

Thrown at server/mcp/role_menu_assigner.go:76

	authorityID, err := parseAuthorityID(args["authorityId"])
	if err != nil {
		return nil, err
	}
	menuIDs, err := parseUintList(args["menuIds"], "menuIds")
	if err != nil {
		return nil, err
	}
	if err := requireNonEmptyList(menuIDs, "menuIds"); err != nil {
		return nil, err
	}
	if len(menuIDs) > orgBatchLimit {
		return nil, fmt.Errorf("单次授权菜单数量不能超过 %d 个", orgBatchLimit)
	}

	// 全量基础菜单:存在性校验、父链补齐、写回时的完整菜单对象都从这里取
	allResp, err := postUpstream[[]system.SysBaseMenu](ctx, "/menu/getMenuList", map[string]any{})
	if err != nil {
		return nil, fmt.Errorf("获取菜单列表失败: %w", err)
	}
	menuIndex := make(map[uint]system.SysBaseMenu)
	flattenBaseMenus(allResp.Data, menuIndex)

	for _, id := range menuIDs {
		if _, ok := menuIndex[id]; !ok {
			return nil, fmt.Errorf("菜单 %d 不存在,可先用 list_all_menus 查询全部菜单", id)
		}
	}

	// 角色当前授权(先读,防覆盖丢权)
	currentResp, err := postUpstream[map[string][]system.SysMenu](ctx, "/menu/getMenuAuthority", map[string]any{
		"authorityId": authorityID,
	})
	if err != nil {
		return nil, fmt.Errorf("获取角色当前菜单授权失败: %w", err)
	}
	currentIDs := make([]uint, 0)

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Check the wrapped cause for network vs upstream API error
  2. Confirm the gva server is running and the menu API responds (curl /menu/getMenuList)
  3. Refresh auth token if 401
  4. Inspect server logs for errors in menu listing (often DB-related)

Example fix

// before
allResp, err := postUpstream[[]system.SysBaseMenu](ctx, "/menu/getMenuList", map[string]any{})
if err != nil {
    return nil, fmt.Errorf("获取菜单列表失败: %w", err)
}
// after
allResp, err := postUpstream[[]system.SysBaseMenu](ctx, "/menu/getMenuList", map[string]any{})
if err != nil {
    log.Printf("getMenuList failed: %v", err)
    return nil, fmt.Errorf("获取菜单列表失败: %w", err)
}
Defensive patterns

Strategy: retry

Validate before calling

// health-check the menu endpoint before assignment
resp, err := postUpstream[[]system.SysBaseMenu](ctx, "/menu/getMenuList", map[string]any{})
if err != nil || len(resp.Data) == 0 {
    return fmt.Errorf("menu source unavailable")
}

Try / catch

err := retry(3, backoff, func() error {
    _, err := assignMenus(ctx, authorityID, menuIDs)
    return err
})

Prevention

When it happens

Trigger: POST /menu/getMenuList fails: server unreachable, 401 on expired token, route missing, or server error while listing menus.

Common situations: gva backend down or restarting; JWT expired mid-session; database connectivity issue on the server side making menu listing fail; wrong upstream base URL.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/21187d9cc47d9ff7. Report an issue: GitHub.