n8n-io/n8n · error · ExpressionExtensionError

arguments must be passed to pluck

Error message

arguments must be passed to pluck

What it means

Thrown as ExpressionExtensionError by the .pluck() array extension when extraArgs is not an array. pluck() expects one or more field-name arguments (variadic strings) and iterates them to pull values from each object in the array. The check is a defensive guard that the variadic-args plumbing delivered an array; if it didn't, the call cannot proceed safely.

Source

Thrown at packages/@n8n/expression-runtime/src/extensions/array-extensions.ts:39

function isEmpty(value: unknown[]): boolean {
	return value.length === 0;
}

function isNotEmpty(value: unknown[]): boolean {
	return value.length > 0;
}

function last(value: unknown[]): unknown {
	return value[value.length - 1];
}

function reverse(value: unknown[]): unknown[] {
	return [...value].reverse();
}

function pluck(value: unknown[], extraArgs: unknown[]): unknown[] {
	if (!Array.isArray(extraArgs)) {
		throw new ExpressionExtensionError('arguments must be passed to pluck');
	}
	if (!extraArgs || extraArgs.length === 0) {
		return value;
	}
	const plucked = value.reduce<unknown[]>((pluckedFromObject, current) => {
		if (current && typeof current === 'object') {
			const p: unknown[] = [];
			Object.keys(current).forEach((k) => {
				(extraArgs as string[]).forEach((field) => {
					if (current && field === k) {
						p.push((current as { [key: string]: unknown })[k]);
					}
				});
			});
			if (p.length > 0) {
				pluckedFromObject.push(p.length === 1 ? p[0] : p);
			}
		}

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Always call pluck with at least one field name: .pluck('name').
  2. If invoking the extension directly, pass extraArgs as an array of strings.
  3. If you see this from normal {{ [...]().pluck('x') }} usage, file a bug against the expression-dispatch harness.
  4. Add a pre-check: if (args.length === 0) return value; before dispatching.

Example fix

// before — invoked without array-boxed args (harness/direct call)
const result = pluck(myArray, 'name'); // extraArgs is a string, not an array
// after — pass args as an array
const result = pluck(myArray, ['name']);
// or in an n8n expression, always pass field names
// {{ $json.rows.pluck('name') }}
Defensive patterns

Strategy: type-guard

Validate before calling

function safePluck(arr, fields) {
  if (!Array.isArray(fields)) throw new TypeError('pluck fields must be an array');
  if (fields.length === 0) return arr;
  return arr.map(o => fields.map(f => o?.[f])).flat();
}

Type guard

function arePluckArgsValid(extraArgs) { return Array.isArray(extraArgs) && extraArgs.every(f => typeof f === 'string'); }

Try / catch

try {
  result = arr.pluck('name');
} catch (e) {
  if (e.name === 'ExpressionExtensionError' && /pluck/i.test(e.message)) {
    // ensure at least one field-name argument is passed
  }
}

Prevention

When it happens

Trigger: Calling .pluck() with no arguments at all in a context where the extension harness passes extraArgs as a non-array, or an internal harness bug that fails to box variadic args. In normal n8n expression usage the harness always supplies an array, so this typically indicates a harness/integration issue rather than an end-user typo.

Common situations: A custom expression harness or test that invokes pluck directly without boxing args. A regression in the extension-dispatch layer. Misuse via a low-level API rather than the templating surface.

Related errors


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/f534589485e20be5. Report an issue: GitHub.