n8n-io/n8n · error · TypeORMError

Provided "take" value is not a number. Please provide a…

Error message

Provided "take" value is not a number. Please provide a numeric value.

What it means

SelectQueryBuilder.take normalized the provided value and it is NaN — a non-numeric 'take' (string garbage after coercion) was passed by pagination code (applyPagination, applyFindOptions, ...). The query cannot be built with an invalid LIMIT and TypeORMError is thrown.

Solutions

  1. Parse env/config once at load: `const TAKE = Number(process.env.PAGE_SIZE)` and validate finiteness.
  2. Use a helper: `const take = toFiniteNumber(value, 50)` returning a default.
  3. Pass undefined instead of '' or '0' (0 is valid but may not be intended).

Example fix

// before
qb.take(process.env.PAGE_SIZE); // string from env
// after
const take = Number(process.env.PAGE_SIZE);
qb.take(Number.isFinite(take) && take > 0 ? take : 50);
Defensive patterns

Strategy: validation

Validate before calling

function toTake(value: unknown, fallback = 50, max = 500): number {
  if (value == null || value === '') return fallback;
  const n = Number(value);
  if (!Number.isFinite(n) || n <= 0) throw new Error(`Invalid take: ${String(value)}`);
  return Math.min(Math.trunc(n), max);
}
// then: qb.take(toTake(process.env.PAGE_SIZE));

Type guard

function isPositiveInt(v: unknown): v is number {
  return typeof v === 'number' && Number.isInteger(v) && v > 0;
}

Prevention

When it happens

Trigger: `.take('foo')`, `.take(undefined-as-string)`, `.take(NaN)` after a malformed calculation, or passing a config object's pageSize that loaded as a string from JSON/env.

Common situations: Env-var-driven page sizes (always strings) fed directly; feature-flag configs that conditionally set take to a stringified number; join-based pagination where the author switched from limit() to take() but kept the string arg.

Related errors


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

Appendix: source

Thrown at packages/@n8n/typeorm/src/query-builder/SelectQueryBuilder.ts:1362

	 * then use the skip method instead.
	 */
	offset(offset?: number): this {
		this.expressionMap.offset = this.normalizeNumber(offset);
		if (this.expressionMap.offset !== undefined && isNaN(this.expressionMap.offset))
			throw new TypeORMError(
				`Provided "offset" value is not a number. Please provide a numeric value.`,
			);

		return this;
	}

	/**
	 * Sets maximal number of entities to take.
	 */
	take(take?: number): this {
		this.expressionMap.take = this.normalizeNumber(take);
		if (this.expressionMap.take !== undefined && isNaN(this.expressionMap.take))
			throw new TypeORMError(
				`Provided "take" value is not a number. Please provide a numeric value.`,
			);

		return this;
	}

	/**
	 * Sets number of entities to skip.
	 */
	skip(skip?: number): this {
		this.expressionMap.skip = this.normalizeNumber(skip);
		if (this.expressionMap.skip !== undefined && isNaN(this.expressionMap.skip))
			throw new TypeORMError(
				`Provided "skip" value is not a number. Please provide a numeric value.`,
			);

		return this;
	}

View on GitHub (pinned to 5ac6606e81)