I’m trying to use my regular express api/*
routes with remix following the steps in this Discussion. It works like a charm in dev mode, but in production env routes are not found (404). I create the build using remix vite:build
.
The dependencies relevant to this question:
"@remix-run/dev": "^2.10.3",
"@remix-run/serve": "^2.10.3",
"@remix-run/express": "^2.10.3",
"@remix-run/node": "^2.10.3",
"@remix-run/react": "^2.10.3",
Below is a snippet from server.ts
:
const viteDevServer =
process.env.NODE_ENV === "production"
? undefined
: await import("vite").then(vite =>
vite.createServer({
server: { middlewareMode: true }
})
);
const remixHandler = createRequestHandler({
build: viteDevServer
? () =>
viteDevServer.ssrLoadModule(
"virtual:remix/server-build"
) as Promise<ServerBuild>
: await import("./build/server/index.js")
});
app.use(
"/api",
viteDevServer
? (req, res, next) =>
viteDevServer
.ssrLoadModule("virtual:remix/server-build")
.then(m => m.entry.module.api(req, res, next))
.catch(err => next(err))
: (await import("./build/server/index.js")).entry.module.api
);
// handle SSR requests
app.all("*", remixHandler);
const PORT = process.env.PORT || 5000;
app.listen(PORT, () =>
console.log(`Express server listening at http://localhost:${PORT}`)
);
After looking at the production build, I discovered that the build/server/index.js contains the router defined but doesn’t include the app.use("/api")
statement.