RocketChat/Rocket.Chat · error · Meteor.Error
error-invalid-members
error-invalid-members
Error message
members should be an array of usernames if provided for rooms other than direct messages
What it means
For every room type except direct messages ('d'), createRoom requires members to be an array of plain username strings. The onlyUsernames type guard fails if any element is a user object, null, or a non-string, producing error-invalid-members.
Source
Thrown at apps/meteor/server/lib/rooms/createRoom.ts:198
// options,
});
const shouldBeHandledByFederation = extraData.federated === true;
if (shouldBeHandledByFederation && owner && !isUserNativeFederated(owner) && !(await FederationMatrix.canUserAccessFederation(owner))) {
throw new Meteor.Error('error-not-authorized-federation', 'Not authorized to access federation', {
method: 'createRoom',
});
}
if (type === 'd') {
return createDirectRoom(members as IUser[], extraData, { ...options, creator: options?.creator || owner?._id });
}
const memberList = [...members];
if (!onlyUsernames(memberList)) {
throw new Meteor.Error(
'error-invalid-members',
'members should be an array of usernames if provided for rooms other than direct messages',
);
}
if (!isValidName(name)) {
throw new Meteor.Error('error-invalid-name', 'Invalid name', {
function: 'RocketChat.createRoom',
});
}
if (!owner) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', {
function: 'RocketChat.createRoom',
});
}
if (!owner?.username) {View on GitHub (pinned to b2c16d5842)
Solutions
- Map members to username strings before calling createRoom for non-DM rooms: members.map(u => typeof u === 'string' ? u : u.username)
- Use a dedicated typed helper or the REST API schema so members must be string[]
- If you really intended object members for a DM, ensure type is 'd'
Example fix
// before
createRoom('c', name, owner, usersFromDb, extraData);
// after
createRoom('c', name, owner, usersFromDb.map(u => u.username), extraData); Defensive patterns
Strategy: type-guard
Validate before calling
const memberNames = members.map(m => (typeof m === 'string' ? m : m?.username)).filter(Boolean) as string[];
if (type !== 'd' && members.some(m => typeof m !== 'string')) {
// normalized above; safe to proceed
}
await createRoom(type, name, owner, memberNames, extraData); Type guard
const onlyUsernames = (members: unknown): members is string[] => Array.isArray(members) && members.every(m => typeof m === 'string');
Try / catch
try {
await createRoom(type, name, owner, members, extraData);
} catch (err) {
if (err instanceof Meteor.Error && err.error === 'error-invalid-members') {
// normalize members to usernames and retry
}
throw err;
} Prevention
- Type the members parameter as string[] for non-DM rooms at the call site
- Map DB user documents to usernames immediately after every query
- Share one normalization helper across all room-creation call sites
When it happens
Trigger: Calling createRoom with type 'c'/'p'/'l'/'t' and members containing objects (e.g. full IUser documents from a find() call), numbers, or undefined entries. Direct rooms ('d') bypass this and accept IUser[] because they are routed to createDirectRoom before the check.
Common situations: Reusing a members array fetched from the database (user documents) instead of mapping to usernames; mixing APIs — passing the same payload to createDirectMessage and createRoom; forgetting .map(u => u.username) after a Users query.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- error-federated-users-in-non-federated-rooms
- error-invalid-name
- error-invalid-user
- error-invalid-room
- error-invalid-field
AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18).
Data as JSON: /api/errors/798f8dce80004d30.
Report an issue: GitHub.