marmelab/react-admin · error · Error
Unknown dataProvider function: ${type}
Error message
Unknown dataProvider function: ${type} What it means
useDataProvider returns a Proxy over the dataProvider; any method accessed on it must exist as a function on the underlying provider. Accessing a property that isn't a function (or a mistyped method name) throws this error instead of 'is not a function'.
Source
Thrown at packages/ra-core/src/dataProvider/useDataProvider.ts:102
defaultDataProvider) as unknown as TDataProvider;
const queryClient = useQueryClient();
const logoutIfAccessDenied = useLogoutIfAccessDenied();
const dataProviderProxy = useMemo(() => {
return new Proxy(dataProvider, {
get: (_, name) => {
if (typeof name === 'symbol' || name === 'then') {
return;
}
if (name === 'supportAbortSignal') {
return dataProvider.supportAbortSignal;
}
return (...args) => {
const type = name.toString();
if (typeof dataProvider[type] !== 'function') {
throw new Error(
`Unknown dataProvider function: ${type}`
);
}
try {
return dataProvider[type]
.apply(dataProvider, args)
.then(response => {
if (
process.env.NODE_ENV === 'development' &&
reactAdminFetchActions.includes(type)
) {
validateResponseFormat(response, type);
}
if (response?.meta?.prefetched) {
populateQueryCache({
data: response?.meta.prefetched,
queryClient,View on GitHub (pinned to 051f511bb0)
Solutions
- Fix the method name typo to match the DataProvider interface (getOne, getList, create, update, updateMany, delete, deleteMany)
- Implement all required DataProvider methods in your custom provider
- Type the provider as DataProvider so TypeScript flags missing/misspelled methods
Example fix
// before
const dataProvider = { getList: ..., getOne: ... }; // missing create etc.
// after
const dataProvider: DataProvider = {
getList: ..., getOne: ..., create: ..., update: ...,
updateMany: ..., delete: ..., deleteMany: ...,
}; Defensive patterns
Strategy: type-guard
Validate before calling
const REQUIRED = ['getList','getOne','getMany','getManyReference','create','update','updateMany','delete','deleteMany'];
const missing = REQUIRED.filter(m => typeof dataProvider[m] !== 'function');
if (missing.length) throw new Error(`dataProvider missing: ${missing.join(', ')}`); Type guard
const isDataProvider = (dp: unknown): dp is DataProvider => typeof dp === 'object' && dp !== null && ['getList','getOne','create','update','delete'].every(m => typeof (dp as any)[m] === 'function');
Try / catch
try {
await dataProvider.getOne('posts', { id });
} catch (e) {
if (/Unknown dataProvider function/.test(e.message)) {
console.error('Method name mismatch or missing method in dataProvider');
}
throw e;
} Prevention
- Annotate custom providers with the DataProvider type to catch typos at compile time
- Use the exported testDataProvider or a completion helper to build providers
- Review method names against the DataProvider interface when migrating major versions
When it happens
Trigger: Calling dataProvider.geteOne (typo), a method absent from the provider, or a non-function property override in a custom/partial dataProvider passed to <Admin dataProvider={...}>.
Common situations: Hand-rolled data providers missing required methods; mock providers built with object spread losing methods; typos in method names after v3/v4 API changes.
Related errors
- Invalid dataProvider response for create: missing id
- The dataProvider threw an error. It should return a rejected
- useEditController: Fetched record's id attribute (${record.i
- useShowController: Fetched record's id attribute (${record.i
- create is not implemented
AI-assisted analysis of marmelab/react-admin@051f511bb0 (2026-08-30).
Data as JSON: /api/errors/eabbf92be0d14123.
Report an issue: GitHub.