n8n-io/n8n · error · NodeOperationError

${error.message}

Error message

${error.message}

What it means

Per-item catch in the MiniMax router's execute loop. When continueOnFail is disabled (the default for batch items), any error thrown by the selected operation's execute callback is re-thrown as a NodeOperationError annotated with the itemIndex and the original error's description. The original message is preserved as the NodeOperationError message.

Source

Thrown at packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/router.ts:49

			break;
		case 'video':
			execute = video[miniMaxTypeData.operation].execute;
			break;
		default:
			throw new NodeOperationError(this.getNode(), `The resource "${resource}" is not supported!`);
	}

	for (let i = 0; i < items.length; i++) {
		try {
			const responseData = await execute.call(this, i);
			returnData.push(...responseData);
		} catch (error) {
			if (this.continueOnFail()) {
				returnData.push({ json: { error: error.message }, pairedItem: { item: i } });
				continue;
			}

			throw new NodeOperationError(this.getNode(), error, {
				itemIndex: i,
				description: error.description,
			});
		}
	}

	return [returnData];
}

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Read error.message — it is the underlying operation's message (e.g. a MiniMax API failure).
  2. Enable 'Continue On Fail' on the node if you want the batch to keep processing past the failing item.
  3. Inspect the item at error.itemIndex and fix or remove it.
  4. Address the root cause named in the underlying operation's error.
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-validate each item's required parameters for the chosen operation before the loop,
// so per-item failures are caught as data errors rather than runtime throws.
function validateItemForOperation(item: INodeExecutionData, resource: string, operation: string): string | null {
  if (!item || typeof item !== 'object') return 'item is missing';
  if (resource === 'audio' && operation === 'transcribe' && !item.json?.audioUrl) {
    return 'audio.transcribe requires item.json.audioUrl';
  }
  // extend per operation
  return null;
}

Type guard

function isItemIndexError(e: unknown): e is NodeOperationError & { itemIndex: number } {
  return e instanceof NodeOperationError && typeof (e as { itemIndex?: number }).itemIndex === 'number';
}

Try / catch

for (let i = 0; i < items.length; i++) {
  try {
    const responseData = await execute.call(this, i);
    returnData.push(...responseData);
  } catch (error) {
    if (this.continueOnFail()) {
      returnData.push({ json: { error: (error as Error).message }, pairedItem: { item: i } });
      continue;
    }
    throw new NodeOperationError(this.getNode(), error, { itemIndex: i });
  }
}

Prevention

When it happens

Trigger: Any underlying operation (TTS, image generation, video generation, text) threw for item i. With continueOnFail off, the router stops the whole execution and surfaces the per-item error; with continueOnFail on, the error is captured into the item's JSON output and processing continues.

Common situations: One bad input item in a batch aborts the run; continueOnFail not enabled when partial success is desired; underlying API error (see errors 862–865, 868–875) propagated through the router.

Related errors


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