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
- Supply a non-empty valueTextArray: { operator: 'containsAny', path: ['tags'], valueTextArray: ['a','b'] }.
- Drop the filter unit if no array is available; containsAny with nothing is not meaningful.
- 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
- Source containsAny arrays from typed list fields, not raw strings.
- Reject empty arrays at the form layer before they reach buildFilter.
- Use a shared filter-builder that enforces per-operator value presence.
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
- Missing 'valueTextArray' for 'containsAll' operator.
- Missing 'valueString' for 'like' operator.
- Missing 'valueNumber' for 'greaterThan' operator.
- Missing 'valueNumber' for 'lessThan' operator.
- Missing 'valueBoolean' for 'isNull' operator.
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/82bef6b521435378.
Report an issue: GitHub.