{"record":{"id":"28b15ad26eb875ce","repo":"transloadit/uppy","slug":"no-key-returned","errorCode":null,"errorMessage":"No key returned","messagePattern":"No key returned","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"packages/@uppy/aws-s3/src/s3-client/CompanionS3.ts","lineNumber":113,"sourceCode":"    if (typeof fileType !== 'string') {\n      throw new TypeError(`${C.ERROR_PREFIX}fileType must be a string`)\n    }\n\n    const method = 'POST'\n    const response = await this._fetch('/multipart', {\n      method,\n      body: JSON.stringify({ filename: keyIn, metadata, type: fileType }),\n      headers: { 'content-type': 'application/json' },\n      signal,\n    })\n    const {\n      key,\n      uploadId,\n    }: { key?: string; uploadId?: string; bucket?: string } =\n      await response.json()\n\n    if (uploadId == null) throw new Error('No uploadId returned')\n    if (key == null) throw new Error('No key returned')\n\n    return { uploadId, key }\n  }\n\n  public override async uploadPart({\n    key,\n    uploadId,\n    data,\n    partNumber,\n    onProgress,\n    signal,\n  }: IT.UploadPartParams) {\n    const response = await this._fetch(\n      `/multipart/${encodeURIComponent(uploadId)}/${encodeURIComponent(partNumber)}?${new URLSearchParams({ key })}`,\n      {\n        method: 'GET',\n        signal,\n      },","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/transloadit/uppy/blob/5d4dedd02a1ac0ae022c75c54aca76558f88e256/packages/@uppy/aws-s3/src/s3-client/CompanionS3.ts#L95-L131","documentation":"The preauth route requires a non-empty string providerName path parameter. This 400 is returned when the provider segment is missing or empty in the URL.","triggerScenarios":"Calling /preauth without a provider segment, or with an empty segment (//preauth); constructing the URL from an undefined provider variable.","commonSituations":"Frontend builds the preauth URL from a dynamic provider value that is undefined at runtime; route mounted under a path prefix that gets stripped by a proxy.","solutions":["Include the provider name in the path, e.g. /companion/url/preauth","Verify the provider variable is defined before building the URL","Check proxy path rewriting"],"exampleFix":"// before\nfetch(`${companionUrl}/preauth`, ...)\n// after\nfetch(`${companionUrl}/${providerName}/preauth`, ...)","handlingStrategy":"validation","validationCode":"if (!providerName) throw new Error('provider name required for preauth URL')\nawait fetch(`${companionUrl}/${encodeURIComponent(providerName)}/preauth`, ...)","typeGuard":"const isNonEmptyString = (s: unknown): s is string => typeof s === 'string' && s.length > 0","tryCatchPattern":null,"preventionTips":["Validate dynamic path segments before fetch","Centralize Companion URL construction in one helper"],"tags":["companion","preauth","http-400","routing"],"backgroundTag":"invalid-route-parameter","analyzedSha":"5d4dedd02a1ac0ae022c75c54aca76558f88e256","analyzedAt":"2026-08-28T12:18:41.267Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}