Budibase/budibase · error · HTTPError
View ${viewId} not found
Error message
View ${viewId} not found What it means
Thrown by the view V2 remove path when no V2 view exists with the given viewId. It resolves the table id from the view id, reads the view, and 404s if absent before attempting to delete it from the datasource document.
Source
Thrown at packages/server/src/sdk/workspace/views/external.ts:109
throw new HTTPError(`Cannot update view type after creation`, 400)
}
view = ensureQuerySet(view)
view = ensureQueryUISet(view)
delete views[existingView.name]
views[view.name] = view
await db.put(ds)
return { view, existingView } as { view: ViewV2; existingView: ViewV2 }
}
export async function remove(viewId: string): Promise<ViewV2> {
const db = context.getWorkspaceDB()
const view = await get(viewId)
if (!view) {
throw new HTTPError(`View ${viewId} not found`, 404)
}
const { datasourceId, tableName } = breakExternalTableId(view.tableId)
const ds = await sdk.datasources.get(datasourceId)
delete ds.entities![tableName].views![view?.name]
await db.put(ds)
return view
}
View on GitHub (pinned to a81a902e9a)
Solutions
- Check existence with sdk.views.get first, or treat 404 as already-deleted success
- Refresh the view list before deleting
- Verify the view id format (getTableIdFromViewId must parse it)
Example fix
// before
await sdk.views.remove(viewId)
// after
try { await sdk.views.remove(viewId) }
catch (e) { if (!(e instanceof HTTPError && e.status === 404)) throw e } Defensive patterns
Strategy: try-catch
Validate before calling
const existing = await sdk.views.get(viewId).catch(() => null) if (!existing) return // nothing to delete
Try / catch
try { await sdk.views.remove(viewId) }
catch (e) {
if (e instanceof HTTPError && e.status === 404) return // idempotent delete
throw e
} Prevention
- Make deletes idempotent by treating 404 as success
- Refresh view lists before issuing deletes
- Avoid concurrent delete jobs for the same view
- Validate view id format before calling
When it happens
Trigger: Calling sdk.views.external.remove (or DELETE view API) with a view id that never existed, was already deleted, belongs to a V1 view, or was removed when the datasource doc was rewritten.
Common situations: Double-delete from a retrying client; stale UI list after another user deleted the view; wrong id casing/format; app copied without the view.
Related errors
- View ${view.id} not found in table ${tableId}
- Row not found
- No view found
- View ${view.id} not found in table ${tableId}
- Error getting account by tenantId ${tenantId}
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/2b23a9e5498f947b.
Report an issue: GitHub.