abhigyanpatwari/GitNexus · error
File not found
Error message
File not found
What it means
HTTP 404 from the repo file-read API when fs.readFile throws ENOENT after the request passed validation and traversal containment — the path was well-formed and inside the repo, but no such file exists on disk. The handler distinguishes err.code === 'ENOENT' from other failures, which fall through to statusFromError (400/403/500). Note the API reads the real filesystem, not the index, so a file present in stale index results but deleted from the working tree will still 404.
Source
Thrown at gitnexus/src/server/api.ts:633
if (startLine !== undefined && Number.isFinite(startLine)) {
const lines = raw.split('\n');
const start = Math.max(0, startLine);
const end =
endLine !== undefined && Number.isFinite(endLine)
? Math.min(lines.length, endLine + 1)
: lines.length;
res.json({
content: lines.slice(start, end).join('\n'),
startLine: start,
endLine: end - 1,
totalLines: lines.length,
});
} else {
res.json({ content: raw, totalLines: raw.split('\n').length });
}
} catch (err: any) {
if (err.code === 'ENOENT') {
res.status(404).json({ error: 'File not found' });
} else {
// statusFromError returns err.status for BadRequestError / ForbiddenError
// (assertString → 400 on array-form ?path=a&path=b; ForbiddenError → 403
// on traversal). Falls back to 500 for unrecognized failures.
res.status(statusFromError(err)).json({ error: err.message || 'Failed to read file' });
}
}
};
export const handleQueryRequest = async (
req: express.Request,
res: express.Response,
resolveRepo: (repoName?: string) => Promise<{ storagePath: string } | undefined>,
): Promise<void> => {
try {
const cypher = req.body.cypher as string;
if (!cypher) {
res.status(400).json({ error: 'Missing "cypher" in request body' });View on GitHub (pinned to aac7515d2a)
Solutions
- Verify the file exists in the working tree of the served repository (git status / ls) at the exact case
- Re-run gitnexus analyze or re-fetch search results so the UI's paths match the current tree
- Check you are querying the right repository (?repo= matches the repo containing the file)
- Handle 404 gracefully in the UI by invalidating cached result entries that reference the missing path
Example fix
// before
const res = await fetch(`${base}/api/file?path=${hit.path}`);
const body = await res.json(); // { error: 'File not found' } breaks the viewer
// after
const res = await fetch(`${base}/api/file?path=${encodeURIComponent(hit.path)}`);
if (res.status === 404) { removeFromResults(hit); notifyUser('File no longer exists — results refreshed'); return; } Defensive patterns
Strategy: validation
Validate before calling
// Only request files that the current results/tree actually reference.
if (!tree.has(filePath)) {
await refreshIndex(); // re-fetch grep/query results or re-run analyze
if (!tree.has(filePath)) throw new Error(`file not in current tree: ${filePath}`);
} Try / catch
const res = await fetch(fileUrl);
if (res.status === 404 && (await res.json()).error === 'File not found') {
dropStaleResult(filePath); // invalidate cached references instead of crashing the viewer
return null;
} Prevention
- Refresh search results after branch switches or rebases
- Match filename case exactly, especially on case-sensitive filesystems
- Confirm ?repo= points at the repository that contains the file
When it happens
Trigger: Requesting a file deleted or renamed since it was indexed; a case mismatch on case-sensitive filesystems (README.md vs readme.md); pointing at the wrong repo (?repo=) where the relative path does not exist; requesting a path that only exists on another branch.
Common situations: Web UI holding stale grep/query results after a branch switch or rebase; files generated at index time but later cleaned (build artifacts); developers testing with paths from their laptop on a CI checkout that differs; typo in the filename.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- Repository not found
- Failed to list repos
- Repository not found. Run: gitnexus analyze
- "path" must be a string
- "path" must be an absolute path
AI-assisted analysis of abhigyanpatwari/GitNexus@aac7515d2a (2026-08-20).
Data as JSON: /api/errors/49f0ac4af33dd8ce.
Report an issue: GitHub.