refactor: improve static file and fallback routing in server.ts
This commit is contained in:
		
							
								
								
									
										42
									
								
								server.ts
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								server.ts
									
									
									
									
									
								
							@@ -26,7 +26,7 @@ const generalPublicDir = path.join(projectRoot, "public");
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const app = new Hono();
 | 
					const app = new Hono();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// APIルート
 | 
					// APIルート(順序を最適化)
 | 
				
			||||||
app.get("/api/feeds", async (c) => {
 | 
					app.get("/api/feeds", async (c) => {
 | 
				
			||||||
  const rows = db
 | 
					  const rows = db
 | 
				
			||||||
    .query("SELECT feed_url FROM processed_feed_items GROUP BY feed_url")
 | 
					    .query("SELECT feed_url FROM processed_feed_items GROUP BY feed_url")
 | 
				
			||||||
@@ -65,18 +65,14 @@ app.post("/api/episodes/:id/regenerate", (c) => {
 | 
				
			|||||||
app.get("/_next/*", async (c) => {
 | 
					app.get("/_next/*", async (c) => {
 | 
				
			||||||
  const assetPath = c.req.path.substring("/_next/".length);
 | 
					  const assetPath = c.req.path.substring("/_next/".length);
 | 
				
			||||||
  const filePath = path.join(frontendBuildDir, "_next", assetPath);
 | 
					  const filePath = path.join(frontendBuildDir, "_next", assetPath);
 | 
				
			||||||
  try {
 | 
					  const file = Bun.file(filePath);
 | 
				
			||||||
    const file = Bun.file(filePath);
 | 
					  if (await file.exists()) {
 | 
				
			||||||
    if (await file.exists()) {
 | 
					    let contentType = "application/octet-stream";
 | 
				
			||||||
      let contentType = "application/octet-stream";
 | 
					    if (filePath.endsWith(".js")) contentType = "application/javascript; charset=utf-8";
 | 
				
			||||||
      if (filePath.endsWith(".js")) contentType = "application/javascript; charset=utf-8";
 | 
					    else if (filePath.endsWith(".css")) contentType = "text/css; charset=utf-8";
 | 
				
			||||||
      else if (filePath.endsWith(".css")) contentType = "text/css; charset=utf-8";
 | 
					    else if (filePath.endsWith(".png")) contentType = "image/png";
 | 
				
			||||||
      else if (filePath.endsWith(".png")) contentType = "image/png";
 | 
					    else if (filePath.endsWith(".jpg") || filePath.endsWith(".jpeg")) contentType = "image/jpeg";
 | 
				
			||||||
      else if (filePath.endsWith(".jpg") || filePath.endsWith(".jpeg")) contentType = "image/jpeg";
 | 
					    return c.body(file, 200, { "Content-Type": contentType });
 | 
				
			||||||
      return c.body(file, 200, { "Content-Type": contentType });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } catch (e) {
 | 
					 | 
				
			||||||
    console.error(`Error serving Next.js static file ${filePath}:`, e);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return c.notFound();
 | 
					  return c.notFound();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@@ -85,13 +81,9 @@ app.get("/_next/*", async (c) => {
 | 
				
			|||||||
app.get("/podcast_audio/*", async (c) => {
 | 
					app.get("/podcast_audio/*", async (c) => {
 | 
				
			||||||
  const audioFileName = c.req.path.substring("/podcast_audio/".length);
 | 
					  const audioFileName = c.req.path.substring("/podcast_audio/".length);
 | 
				
			||||||
  const audioFilePath = path.join(podcastAudioDir, audioFileName);
 | 
					  const audioFilePath = path.join(podcastAudioDir, audioFileName);
 | 
				
			||||||
  try {
 | 
					  const file = Bun.file(audioFilePath);
 | 
				
			||||||
    const file = Bun.file(audioFilePath);
 | 
					  if (await file.exists()) {
 | 
				
			||||||
    if (await file.exists()) {
 | 
					    return c.body(file, 200, { "Content-Type": "audio/mpeg" });
 | 
				
			||||||
      return c.body(file, 200, { "Content-Type": "audio/mpeg" });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } catch (e) {
 | 
					 | 
				
			||||||
    console.error(`Error serving audio file ${audioFilePath}:`, e);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return c.notFound();
 | 
					  return c.notFound();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@@ -113,13 +105,9 @@ app.get("/podcast.xml", async (c) => {
 | 
				
			|||||||
// フォールバックとして index.html
 | 
					// フォールバックとして index.html
 | 
				
			||||||
app.get("*", async (c) => {
 | 
					app.get("*", async (c) => {
 | 
				
			||||||
  const indexPath = path.join(frontendBuildDir, "server", "pages", "index.html");
 | 
					  const indexPath = path.join(frontendBuildDir, "server", "pages", "index.html");
 | 
				
			||||||
  try {
 | 
					  const file = Bun.file(indexPath);
 | 
				
			||||||
    const file = Bun.file(indexPath);
 | 
					  if (await file.exists()) {
 | 
				
			||||||
    if (await file.exists()) {
 | 
					    return c.body(file, 200, { "Content-Type": "text/html; charset=utf-8" });
 | 
				
			||||||
      return c.body(file, 200, { "Content-Type": "text/html; charset=utf-8" });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } catch (e) {
 | 
					 | 
				
			||||||
    console.error("Error serving index.html:", e);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return c.notFound();
 | 
					  return c.notFound();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user