{"record":{"id":"cb03bfa16c14f149","repo":"langgenius/dify","slug":"name-must-be-a-non-empty-array","errorCode":null,"errorMessage":"${name} must be a non-empty array","messagePattern":"(.+?) must be a non-empty array","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"sdks/nodejs-client/src/client/knowledge-base.ts","lineNumber":52,"sourceCode":"import { isFormData } from '../http/form-data'\nimport { DifyClient } from './base'\nimport {\n  ensureNonEmptyString,\n  ensureOptionalBoolean,\n  ensureOptionalInt,\n  ensureOptionalString,\n  ensureStringArray,\n} from './validation'\n\nfunction ensureFormData(form: unknown, context: string): asserts form is SdkFormData {\n  if (!isFormData(form)) {\n    throw new FileUploadError(`${context} requires FormData`)\n  }\n}\n\nconst ensureNonEmptyArray = (value: unknown, name: string): void => {\n  if (!Array.isArray(value) || value.length === 0) {\n    throw new ValidationError(`${name} must be a non-empty array`)\n  }\n}\n\nexport class KnowledgeBaseClient extends DifyClient {\n  async listDatasets(options?: DatasetListOptions): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureOptionalInt(options?.page, 'page')\n    ensureOptionalInt(options?.limit, 'limit')\n    ensureOptionalString(options?.keyword, 'keyword')\n    ensureOptionalBoolean(options?.includeAll, 'includeAll')\n\n    const query: QueryParams = {\n      page: options?.page,\n      limit: options?.limit,\n      keyword: options?.keyword ?? undefined,\n      include_all: options?.includeAll ?? undefined,\n    }\n\n    if (options?.tagIds && options.tagIds.length > 0) {","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/sdks/nodejs-client/src/client/knowledge-base.ts#L34-L70","documentation":"Thrown by the private ensureNonEmptyArray() helper in knowledge-base.ts:52 as a ValidationError. It guards two payload fields: request.segments in createSegments() and request.operation_data in updateDocumentsMetadata(). The value must be an Array with length > 0; null, undefined, non-arrays, and empty arrays all fail.","triggerScenarios":"Calling kb.createSegments(datasetId, documentId, { segments: [] }) or kb.createSegments(..., { segments: undefined }); similarly kb.updateDocumentsMetadata(datasetId, { operation_data: [] }) or with operation_data missing. The guard at knowledge-base.ts:51 rejects the value before the POST.","commonSituations":"Filtering segments down to zero results and passing the emptied array; mapping a list and producing [] when source data was empty; renaming the field (segments vs segment_list); forgetting the operation_data key when constructing metadata updates.","solutions":["Populate the array with at least one valid item: kb.createSegments(ds, doc, { segments: [{ content: '...' }] }).","Guard at the call site: if (segments.length) await kb.createSegments(...); else skip — the API does not accept no-op creates.","For updateDocumentsMetadata, ensure operation_data contains at least one { document_id, metadata_list } entry.","Double-check the request object key spelling matches the SDK's expected field name."],"exampleFix":"// before\nawait kb.createSegments(ds, doc, { segments: filtered }) // filtered === []\n\n// after\nif (filtered.length) {\n  await kb.createSegments(ds, doc, { segments: filtered })\n}","handlingStrategy":"validation","validationCode":"function assertNonEmpty<T>(value: unknown, name: string): asserts value is T[] {\n  if (!Array.isArray(value) || value.length === 0) throw new Error(`${name} must be a non-empty array`)\n}","typeGuard":"function isNonEmptyArray<T>(value: unknown): value is T[] {\n  return Array.isArray(value) && value.length > 0\n}","tryCatchPattern":"try {\n  await kb.createSegments(ds, doc, { segments })\n} catch (err) {\n  if (err instanceof Error && err.name === 'ValidationError' && /non-empty array/.test(err.message)) {\n    // skip the call when there is nothing to create\n  } else throw err\n}","preventionTips":["Skip the SDK call entirely when your source list is empty rather than passing [].","Type request fields as required arrays (segments: Segment[]; not optional) so TS flags omissions.","Add an upstream filter that drops malformed segment entries."],"tags":["validation","knowledge-base","segments","metadata","required-field"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}