m1k1o/neko · error
cannot select user in multiuser mode
Error message
cannot select user in multiuser mode
What it means
The multiuser provider does not keep an in-memory member registry keyed by ID; members exist only as config entries and sessions created on first login. Select() is therefore unsupported and always returns this error instead of a profile.
Source
Thrown at server/internal/member/multiuser/provider.go:73
}
return "", types.MemberProfile{}, types.ErrMemberInvalidPassword
}
func (provider *MemberProviderCtx) Insert(username string, password string, profile types.MemberProfile) (string, error) {
return "", errors.New("new user is created on first login in multiuser mode")
}
func (provider *MemberProviderCtx) UpdateProfile(id string, profile types.MemberProfile) error {
return nil
}
func (provider *MemberProviderCtx) UpdatePassword(id string, password string) error {
return errors.New("password can only be modified in config while in multiuser mode")
}
func (provider *MemberProviderCtx) Select(id string) (types.MemberProfile, error) {
return types.MemberProfile{}, errors.New("cannot select user in multiuser mode")
}
func (provider *MemberProviderCtx) SelectAll(limit int, offset int) (map[string]types.MemberProfile, error) {
return map[string]types.MemberProfile{}, nil
}
func (provider *MemberProviderCtx) Delete(id string) error {
return errors.New("cannot delete user in multiuser mode")
}
View on GitHub (pinned to b0f01cedea)
Solutions
- Do not call Select in multiuser mode; use the session/authenticated state instead of member lookup.
- Read the intended user data from the server config entries directly.
- Switch to a dynamic member provider if per-ID profile lookup is required.
Example fix
// before
profile, err := memberClient.Select(id)
// after: guard against unsupported mode
if memberProvider == "multiuser" {
return errors.New("user lookup unsupported in multiuser mode")
}
profile, err := memberClient.Select(id) Defensive patterns
Strategy: validation
Validate before calling
if memberProvider == "multiuser" {
return errors.New("per-ID member lookup unsupported in multiuser mode")
}
profile, err := memberClient.Select(id) Type guard
func isSelectUnsupportedErr(err error) bool {
return err != nil && strings.Contains(err.Error(), "cannot select user")
} Try / catch
profile, err := memberClient.Select(id)
if err != nil {
if isSelectUnsupportedErr(err) {
profile = types.MemberProfile{} // fall back to empty/anonymous profile
} else {
return err
}
} Prevention
- Avoid per-ID member lookups in static provider modes; use the session identity instead.
- Derive profile data from config entries rather than the members API in multiuser mode.
- Gate user-detail admin views on the active member provider.
- Remember SelectAll returns an empty map in multiuser mode — do not infer users from it.
When it happens
Trigger: Any call to the member Select API (lookup a member profile by ID, e.g. admin user-detail endpoint) while the member provider is 'multiuser'.
Common situations: An admin panel tries to fetch a user profile by ID after authentication; in multiuser mode this lookup is not implemented, so it always fails even for users who logged in successfully.
Related errors
- new user is created on first login in multiuser mode
- password can only be modified in config while in multiuser m
- cannot delete user in multiuser mode
- cannot select user in noauth mode
- new user is created on first login in noauth mode
AI-assisted analysis of m1k1o/neko@b0f01cedea (2026-09-01).
Data as JSON: /api/errors/ac34e27af47dd9a4.
Report an issue: GitHub.