Railnode reads runtime config from the project root, using the first file that exists:
backend.config.jsonbackend.config.jsbackend.config.mjsbackend.config.cjs
If none exists, defaults are used.
backend.config.mjs:
export default {
port: 3000,
// modelsDir: "src/models",
// routesDir: "src/routes",
// enableCrud: true,
};port(number)modelsDir(string) — relative to project rootroutesDir(string) — relative to project rootenableCrud(boolean)db(object) — see Database adapters
If you don’t set modelsDir / routesDir, Railnode tries:
- Models:
dist/modelsthensrc/models - Routes:
dist/routesthensrc/routes
This supports both:
- production builds (
npm run buildthennode dist/index.js) - dev (
railnode dev) loading TypeScript fromsrc/
When you call createApp({ ... }) you can provide overrides.
Effective config is merged like this:
- File config from
backend.config.* - Overrides passed to
createApp(config)
The CLI’s railnode dev --port/--project/--models-dir/--routes-dir/--no-crud ultimately becomes createApp({ ... }) overrides.
backend.config.json must be a JSON object.
Example:
{
"port": 3000,
"enableCrud": true,
"db": { "adapter": "json", "json": { "dir": ".railnode/db" } }
}If you use .js/.mjs/.cjs, export a default object:
export default { port: 3000 };