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
- Check the wrapped cause for network vs upstream API error
- Confirm the gva server is running and the menu API responds (curl /menu/getMenuList)
- Refresh auth token if 401
- 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
- Ensure the gva backend is reachable before batch operations
- Refresh tokens proactively
- Check server DB health if menu listing fails repeatedly
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.