langgenius/dify · error · ValidationError
Parameter '${key}' must be an integer
Error message
Parameter '${key}' must be an integer What it means
Thrown by validateParams() in validation.ts:116 as a ValidationError for the pagination keys 'page', 'limit', and 'page_size'. In the HTTP layer these must be integers when present. Floats, numeric strings, NaN, and booleans fail Number.isInteger().
Source
Thrown at sdks/nodejs-client/src/client/validation.ts:116
} else if (Array.isArray(value)) {
if (value.length > MAX_LIST_LENGTH) {
throw new ValidationError(
`Parameter '${key}' exceeds maximum size of ${MAX_LIST_LENGTH} items`,
)
}
} else if (isRecord(value)) {
if (Object.keys(value).length > MAX_DICT_LENGTH) {
throw new ValidationError(
`Parameter '${key}' exceeds maximum size of ${MAX_DICT_LENGTH} items`,
)
}
}
if (key === 'user' && typeof value !== 'string') {
throw new ValidationError(`Parameter '${key}' must be a string`)
}
if ((key === 'page' || key === 'limit' || key === 'page_size') && !Number.isInteger(value)) {
throw new ValidationError(`Parameter '${key}' must be an integer`)
}
if (key === 'files' && !Array.isArray(value) && typeof value !== 'object') {
throw new ValidationError(`Parameter '${key}' must be a list or dict`)
}
if (key === 'rating' && value !== 'like' && value !== 'dislike') {
throw new ValidationError(`Parameter '${key}' must be 'like' or 'dislike'`)
}
})
}
View on GitHub (pinned to ef8544b173)
Solutions
- Coerce at the boundary: const page = rawPage ? Number(rawPage) : undefined; const limit = rawLimit ? Number(rawLimit) : undefined.
- Use parseInt(raw, 10) and skip when NaN.
- Type pagination options as number | undefined upstream so string sources fail the compiler.
Example fix
// before
await kb.listDatasets({ page: req.query.page, limit: req.query.limit }) // strings
// after
const page = req.query.page ? Number(req.query.page) : undefined
const limit = req.query.limit ? Number(req.query.limit) : undefined
await kb.listDatasets({ page, limit }) Defensive patterns
Strategy: validation
Validate before calling
function assertIntegerKeys(params: Record<string, unknown>) {
for (const k of ['page', 'limit', 'page_size']) {
if (k in params && params[k] !== undefined && params[k] !== null && !Number.isInteger(params[k])) {
throw new Error(`Parameter '${k}' must be an integer`)
}
}
} Type guard
function isIntegerPagination(params: Record<string, unknown>): boolean {
return ['page', 'limit', 'page_size'].every((k) =>
!(k in params) || params[k] === undefined || params[k] === null || Number.isInteger(params[k])
)
} Try / catch
try {
await kb.listDatasets({ page, limit })
} catch (err) {
if (err instanceof Error && /must be an integer/.test(err.message)) {
await kb.listDatasets({
page: page ? Number(page) : undefined,
limit: limit ? Number(limit) : undefined,
})
} else throw err
} Prevention
- Coerce query-string pagination to numbers at the handler boundary.
- Type pagination options as number | undefined.
- Reject fractional page/limit values upstream.
When it happens
Trigger: Any request carrying { page: '2' }, { limit: 1.5 }, { page_size: '20' } in query or body. Triggered from client.ts request() during validateParams, after the size checks.
Common situations: Pagination values pulled from URL query strings (always strings in HTTP); JSON config with quoted numbers; computing page from a float offset without rounding.
Related errors
- Parameter '${key}' must be a string
- ${name} must be an integer when set
- Parameter '${key}' exceeds maximum length of ${MAX_STRING_LE
- Parameter '${key}' exceeds maximum size of ${MAX_LIST_LENGTH
- Parameter '${key}' exceeds maximum size of ${MAX_DICT_LENGTH
AI-assisted analysis of langgenius/dify@ef8544b173 (2026-08-12).
Data as JSON: /api/errors/5e0f03b90773f05a.
Report an issue: GitHub.