Railnode’s built-in CRUD layer reads/writes through a small DB adapter interface.
That means:
- CRUD route code does not change when you switch storage.
- You pick the adapter in
backend.config.*.
- Adapter:
memory - Data resets on server restart
Config:
{
"enableCrud": true,
"db": { "adapter": "memory" }
}- Adapter:
json - Stores one file per model under a directory
Config:
{
"enableCrud": true,
"db": {
"adapter": "json",
"json": { "dir": ".railnode/db" }
}
}Notes:
dirmay be relative to the project root.- Model
Todowrites to.railnode/db/todo.json.
- Adapter:
postgres - Uses
db.postgres.connectionStringorDATABASE_URL
Config:
{
"enableCrud": true,
"db": {
"adapter": "postgres",
"postgres": {
"connectionString": "postgres://user:pass@localhost:5432/mydb",
"schema": "public"
}
}
}Environment-only configuration:
- Set
DATABASE_URLand keep config minimal:
{ "db": { "adapter": "postgres" } }- Adapter:
mongodb - Uses
db.mongodb.connectionStringorMONGODB_URI - Uses
db.mongodb.dbNameorMONGODB_DB
Config:
{
"enableCrud": true,
"db": {
"adapter": "mongodb",
"mongodb": {
"connectionString": "mongodb://localhost:27017",
"dbName": "railnode_dev",
"collectionPrefix": ""
}
}
}Environment-only configuration:
MONGODB_URI=mongodb://...MONGODB_DB=mydb
- Stop the server.
- Update
backend.config.*(or environment variables). - Start the server.
Notes:
- Each adapter has different persistence semantics.
- Switching adapters does not migrate existing data automatically.
IDs:
- Memory/JSON/Postgres adapters generate string UUIDs.
- MongoDB uses the document’s ObjectId hex string.
If you are embedding Railnode (not just using the CLI), you can bypass config and pass a dbAdapter:
import { createApp, createPostgresDbAdapter } from "railnode";
const app = createApp({
dbAdapter: createPostgresDbAdapter({
connectionString: process.env.DATABASE_URL!,
schema: "public",
}),
});
await app.start();When dbAdapter is provided, it wins over db config.