n8n-io/n8n · warning · OperationalError

Missing 'valueTextArray' for 'containsAny' operator.

Error message

Missing 'valueTextArray' for 'containsAny' operator.

What it means

OperationalError from buildFilter when operator is 'containsany' (case-insensitive) but valueTextArray is undefined. containsAny maps to property.containsAny(...) which requires an array of strings.

Source

Thrown at packages/@n8n/nodes-langchain/nodes/vector_store/VectorStoreWeaviate/Weaviate.utils.ts:86

function buildFilter(filter: WeaviateFilterUnit): FilterValue {
	const { path, operator } = filter;
	const property = weaviate.filter.byProperty(path[0]);

	switch (operator.toLowerCase()) {
		case 'equal':
			if (filter.valueString !== undefined) return property.equal(filter.valueString);
			if (filter.valueNumber !== undefined) return property.equal(filter.valueNumber);
			break;

		case 'like':
			if (filter.valueString === undefined) {
				throw new OperationalError("Missing 'valueString' for 'like' operator.");
			}
			return property.like(filter.valueString);

		case 'containsany':
			if (filter.valueTextArray === undefined) {
				throw new OperationalError("Missing 'valueTextArray' for 'containsAny' operator.");
			}
			return property.containsAny(filter.valueTextArray);

		case 'containsall':
			if (filter.valueTextArray === undefined) {
				throw new OperationalError("Missing 'valueTextArray' for 'containsAll' operator.");
			}
			return property.containsAll(filter.valueTextArray);

		case 'greaterthan':
			if (filter.valueNumber === undefined) {
				throw new OperationalError("Missing 'valueNumber' for 'greaterThan' operator.");
			}
			return property.greaterThan(filter.valueNumber);

		case 'lessthan':
			if (filter.valueNumber === undefined) {
				throw new OperationalError("Missing 'valueNumber' for 'lessThan' operator.");

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Supply a non-empty valueTextArray: { operator: 'containsAny', path: ['tags'], valueTextArray: ['a','b'] }.
  2. Drop the filter unit if no array is available; containsAny with nothing is not meaningful.
  3. Pre-validate filter units so each operator carries its required value field.

Example fix

// before: { operator: 'containsAny', path: ['tags'] }
// after:  { operator: 'containsAny', path: ['tags'], valueTextArray: ['red','blue'] }
Defensive patterns

Strategy: validation

Validate before calling

if (f.operator.toLowerCase() === 'containsany' && (!Array.isArray(f.valueTextArray) || f.valueTextArray.length === 0)) { throw new Error("'containsAny' requires a non-empty valueTextArray"); }

Type guard

function isContainsAnyComplete(f: WeaviateFilterUnit): f is WeaviateFilterUnit & { valueTextArray: string[] } { return f.operator.toLowerCase() === 'containsany' && Array.isArray(f.valueTextArray) && f.valueTextArray.every(v => typeof v === 'string'); }

Try / catch

try { buildFilter(unit) } catch (e) { if (/valueTextArray.*containsAny/.test(e.message)) { /* supply array */ } else throw e; }

Prevention

When it happens

Trigger: Filter unit shaped { operator: 'containsany', path: [...], /* valueTextArray missing */ } reaches buildFilter.

Common situations: Array value left empty or sourced from an expression that resolved to undefined; JSON filter missing the valueTextArray key; caller assumed a default empty array.

Related errors


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