{"record":{"id":"20d3aaf856fe41e7","repo":"marmelab/react-admin","slug":"usecreate-mutation-requires-a-non-empty-data-objec","errorCode":null,"errorMessage":"useCreate mutation requires a non-empty data object","messagePattern":"useCreate mutation requires a non-empty data object","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ra-core/src/dataProvider/useCreate.ts","lineNumber":115,"sourceCode":"        onSettled,\n        ...mutationOptions\n    } = options;\n\n    const dataProviderCreate = useEvent((resource: string, params) =>\n        dataProvider.create<RecordType, ResultRecordType>(\n            resource,\n            params as CreateParams<RecordType>\n        )\n    );\n    const customMutationFnWithDataProviderResult = async (\n        resource: string | undefined,\n        params: Omit<UseCreateMutateParams<RecordType>, 'resource'>\n    ) => {\n        if (resource == null) {\n            throw new Error('useCreate mutation requires a resource');\n        }\n        if (params.data == null) {\n            throw new Error(\n                'useCreate mutation requires a non-empty data object'\n            );\n        }\n        if (customMutationFn == null) {\n            return dataProviderCreate(resource, params);\n        }\n\n        return {\n            data: await customMutationFn({ resource, ...params }),\n        };\n    };\n\n    const [mutate, mutationResult] = useMutationWithMutationMode<\n        MutationError,\n        CreateResult<ResultRecordType>,\n        UseCreateMutateParams<RecordType>\n    >(\n        { resource, ...params },","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/marmelab/react-admin/blob/051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0/packages/ra-core/src/dataProvider/useCreate.ts#L97-L133","documentation":"useCreate rejects mutations whose params.data is null or undefined, because a create call without payload data is meaningless. The check happens before the data provider is invoked.","triggerScenarios":"Calling mutate(resource) or mutate(resource, {}) with no data field, or building the payload asynchronously and mutating before it is ready.","commonSituations":"Form submissions wired before state initialization; conditional code paths where the record object is still undefined at submit time.","solutions":["Always pass a non-null data object: mutate('posts', { data: { title: 'Hi' } })","Guard the mutation: if (record) mutate('posts', { data: record })","Provide defaults in the form or hook so data is never empty"],"exampleFix":"// before\nmutate('posts', { data: record }); // record may be undefined\n// after\nif (record != null) mutate('posts', { data: record });","handlingStrategy":"validation","validationCode":"if (data == null) {\n  throw new Error('Cannot create: data payload is empty');\n}\nmutate('posts', { data });","typeGuard":"const hasData = (p: { data?: unknown }): p is { data: Record<string, unknown> } => p.data != null && typeof p.data === 'object';","tryCatchPattern":"try {\n  await mutate('posts', { data });\n} catch (e) {\n  if (/non-empty data object/.test(e.message)) {\n    notify('Nothing to save: form data is empty', { type: 'warning' });\n    return;\n  }\n  throw e;\n}","preventionTips":["Gate submit handlers on form validation (isFormValid / dirty fields)","Initialize form defaultValues so data is never undefined","Disable the submit button while the payload is being assembled"],"tags":["react-admin","usecreate","mutation","validation"],"backgroundTag":"missing-required-argument","analyzedSha":"051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0","analyzedAt":"2026-08-30T02:28:14.926Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}