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
- Always call pluck with at least one field name: .pluck('name').
- If invoking the extension directly, pass extraArgs as an array of strings.
- If you see this from normal {{ [...]().pluck('x') }} usage, file a bug against the expression-dispatch harness.
- 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
- Always pass at least one field name to .pluck(): .pluck('name').
- If invoking the extension directly, pass extraArgs as an array of strings.
- Report it as a bug if it occurs during normal templating usage.
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
- smartJoin(): expected two string args, e.g. .smartJoin("name
- chunk(): expected non-zero numeric arg, e.g. .chunk(5)
- renameKeys(): expected an even amount of args: from1, to1 [,
- merge(): expected object arg
- merge(): expected array arg, e.g. .merge([{ id: 1, otherValu
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/f534589485e20be5.
Report an issue: GitHub.