{"id":"11901925c035011d","repo":"axios/axios","slug":"target-must-be-an-object","errorCode":null,"errorMessage":"target must be an object","messagePattern":"target must be an object","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"lib/helpers/toFormData.js","lineNumber":96,"sourceCode":" * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n  if (!utils.isObject(obj)) {\n    throw new TypeError('target must be an object');\n  }\n\n  // eslint-disable-next-line no-param-reassign\n  formData = formData || new (PlatformFormData || FormData)();\n\n  // eslint-disable-next-line no-param-reassign\n  options = utils.toFlatObject(\n    options,\n    {\n      metaTokens: true,\n      dots: false,\n      indexes: false,\n    },\n    false,\n    function defined(option, source) {\n      // eslint-disable-next-line no-eq-null,eqeqeq\n      return !utils.isUndefined(source[option]);\n    }","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/axios/axios/blob/c3f553c740ebf3dff5e22dae24e9caaafafddd2d/lib/helpers/toFormData.js#L78-L114","documentation":"`toFormData` — the helper axios uses to serialize a plain object into FormData (e.g. for multipart/form-data requests or via `axios.toFormData`) — requires its first argument to be an object. If `utils.isObject(obj)` fails, it throws a plain TypeError 'target must be an object' before doing any work. Note this is one of the few raw TypeErrors in the library (it's an argument-contract violation, not an axios-originated request failure).","triggerScenarios":"Calling `axios.toFormData(value)` or posting with a multipart Content-Type where the request data is a string, number, null, undefined, or boolean instead of an object/array — e.g. `axios.post(url, 'name=x', { headers: { 'Content-Type': 'multipart/form-data' } })`.","commonSituations":"Passing an already-serialized string (JSON.stringify'd data or a querystring) while also setting a multipart Content-Type, which routes it through toFormData; passing undefined because a variable wasn't populated; confusing URLSearchParams-style usage with FormData usage.","solutions":["Pass a plain object (or array) as the data: `axios.post(url, { name: 'x', file }, { headers: { 'Content-Type': 'multipart/form-data' } })`.","Don't pre-serialize — remove JSON.stringify/querystring encoding and let axios serialize, or drop the multipart Content-Type if you intend to send a raw string.","If you already have a FormData instance, pass it directly as the request data instead of running it through toFormData."],"exampleFix":"// before\nawait axios.post('/upload', JSON.stringify(payload), { headers: { 'Content-Type': 'multipart/form-data' } });\n// after\nawait axios.post('/upload', payload, { headers: { 'Content-Type': 'multipart/form-data' } });","handlingStrategy":"type-guard","validationCode":"if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) {\n  throw new TypeError('toFormData payload must be a plain object or FormData-compatible object');\n}","typeGuard":"function isFormDataTarget(value) {\n  return value !== null && typeof value === 'object';\n}","tryCatchPattern":"try {\n  const fd = axios.toFormData(payload, new FormData());\n} catch (err) {\n  if (err instanceof TypeError && /target must be an object/.test(err.message)) {\n    // caller passed a primitive/null as the FormData target\n  } else throw err;\n}","preventionTips":["Only pass an object (or an existing FormData instance) as the second argument to toFormData; never null or a primitive","Type your wrapper around toFormData so TypeScript catches non-object targets at compile time","Validate deserialized/user-supplied payloads are objects before serialization"],"tags":["form-data","serialization","type-error","api-usage"],"analyzedSha":"c3f553c740ebf3dff5e22dae24e9caaafafddd2d","analyzedAt":"2026-07-31T18:49:43.633Z","schemaVersion":2}