{"record":{"id":"5e0f03b90773f05a","repo":"langgenius/dify","slug":"parameter-key-must-be-an-integer","errorCode":null,"errorMessage":"Parameter '${key}' must be an integer","messagePattern":"Parameter '(.+?)' must be an integer","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"sdks/nodejs-client/src/client/validation.ts","lineNumber":116,"sourceCode":"    } else if (Array.isArray(value)) {\n      if (value.length > MAX_LIST_LENGTH) {\n        throw new ValidationError(\n          `Parameter '${key}' exceeds maximum size of ${MAX_LIST_LENGTH} items`,\n        )\n      }\n    } else if (isRecord(value)) {\n      if (Object.keys(value).length > MAX_DICT_LENGTH) {\n        throw new ValidationError(\n          `Parameter '${key}' exceeds maximum size of ${MAX_DICT_LENGTH} items`,\n        )\n      }\n    }\n\n    if (key === 'user' && typeof value !== 'string') {\n      throw new ValidationError(`Parameter '${key}' must be a string`)\n    }\n    if ((key === 'page' || key === 'limit' || key === 'page_size') && !Number.isInteger(value)) {\n      throw new ValidationError(`Parameter '${key}' must be an integer`)\n    }\n    if (key === 'files' && !Array.isArray(value) && typeof value !== 'object') {\n      throw new ValidationError(`Parameter '${key}' must be a list or dict`)\n    }\n    if (key === 'rating' && value !== 'like' && value !== 'dislike') {\n      throw new ValidationError(`Parameter '${key}' must be 'like' or 'dislike'`)\n    }\n  })\n}\n","sourceCodeStart":98,"sourceCodeEnd":126,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/sdks/nodejs-client/src/client/validation.ts#L98-L126","documentation":"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().","triggerScenarios":"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.","commonSituations":"Pagination values pulled from URL query strings (always strings in HTTP); JSON config with quoted numbers; computing page from a float offset without rounding.","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."],"exampleFix":"// before\nawait kb.listDatasets({ page: req.query.page, limit: req.query.limit }) // strings\n\n// after\nconst page = req.query.page ? Number(req.query.page) : undefined\nconst limit = req.query.limit ? Number(req.query.limit) : undefined\nawait kb.listDatasets({ page, limit })","handlingStrategy":"validation","validationCode":"function assertIntegerKeys(params: Record<string, unknown>) {\n  for (const k of ['page', 'limit', 'page_size']) {\n    if (k in params && params[k] !== undefined && params[k] !== null && !Number.isInteger(params[k])) {\n      throw new Error(`Parameter '${k}' must be an integer`)\n    }\n  }\n}","typeGuard":"function isIntegerPagination(params: Record<string, unknown>): boolean {\n  return ['page', 'limit', 'page_size'].every((k) =>\n    !(k in params) || params[k] === undefined || params[k] === null || Number.isInteger(params[k])\n  )\n}","tryCatchPattern":"try {\n  await kb.listDatasets({ page, limit })\n} catch (err) {\n  if (err instanceof Error && /must be an integer/.test(err.message)) {\n    await kb.listDatasets({\n      page: page ? Number(page) : undefined,\n      limit: limit ? Number(limit) : undefined,\n    })\n  } else throw err\n}","preventionTips":["Coerce query-string pagination to numbers at the handler boundary.","Type pagination options as number | undefined.","Reject fractional page/limit values upstream."],"tags":["validation","integer","pagination","type-coercion","http","guard"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}