Run your own version of the MongoDB Atlas Data API for local development and testing.
This is a simple HTTP server that simulates the Data API endpoints. It was designed for exact parity with the Atlas version, it was not designed for use in production.
v1 Update! MongoDB's "Data API" is out of beta, so this library is now v1 as well! 🎉
Suppose you have a MongoDB instance running locally, following these Docker instructions, and you want to also run a local version of the Data API for development:
mongodb-local-data-api --username=AzureDiamond \
--password=hunter2 \
--mongodbPort=27017 \
--apiPort=3001 \
--key=battery-horse-staple
That starts this mock-Data-API with the base URL as http://localhost:3001
, so e.g. to find a single document (which is the /action/findOne
path) with cURL
you would do:
curl --request POST \
'http://localhost:3000/action/findOne' \
--header 'Content-Type: application/json' \
--header 'api-key: battery-horse-staple' \
--data-raw '{
"dataSource": "Cluster0",
"database": "todo",
"collection": "tasks",
"filter": {
"text": "Do the dishes"
}
}'
You can make any request to this API that is in the official documentation.
You can interact with this library programmatically, if you'd rather:
import { setup } from 'mongodb-local-data-api'
const database = setup({
// the URL to access the locally-running MongoDB instance
url: 'mongodb://AzureDiamond:hunter2@localhost:27017',
})
// correlates to the MongoDB action, e.g. find, findOne, aggregate, ...
const action = 'insertOne'
// these are the parameters as you would send them to the Data API
const parameters = {
dataSource: 'Cluster0',
database: 'todo',
collection: 'tasks',
document: {
status: 'open',
text: 'Do the dishes'
}
}
const { status, body } = await database(action, parameters)
These are the options you can pass to the setup
function:
url: String
- The fully qualified URL to the MongoDB instance. This would look likemongodb://AzureDiamond:hunter2@localhost:27017
or similar. If you set this property, the remaining MongoDB-related options will be ignored.username: String
- The username to access the MongoDB instance.password: String
- The password to access the MongoDB instance.dbDomain: String
- The domain of the MongoDB instance. (Default:localhost
)dbPort: Integer
- The port of the MongoDB instance. (Default:27017
)retryCount: Integer
- By default any interrupted connections to MongoDB will be retried indefinitely. Set to0
to disable, or set to a limit. (Default:Infinity
)verbose: Boolean
- Whether to print out additional information to the console. (Default:false
)
The options you can pass to the CLI are the same as above, but include these options:
apiPort: Integer
- The port used to access this Data API instance. (Default:3007
)key: String
- Authentication keys to look for on theAPI-Key
request header, to access the local API. Set this option multiple times for multiple keys. Default: noAPI-Key
required.
For the CLI tool, all options except key
can also be set using the environment variable version instead, which is simply the prefix MONGODBLOCAL_
followed by the option name, e.g. MONGODBLOCAL_URL
. The environment variable is case-insensitive, so e.g. MONGODBLOCAL_url
or MongoDBLocal_url
would also work.
Here's an example of how I've used this library to run a local environment, with MongoDB in a Docker container, and an npm
run script to coordinate.
I set up a container with services, using docker compose
. (In most of my applications I had additional other services in the same container.)
# $REPO/docker/docker-compose.yaml
version: '3.8'
services:
mongodb-local:
image: mongo:5.0
ports:
- "27017:27017"
# this is how you get MongoDB to stop spewing out so many logs
command: mongod --quiet --logpath /dev/null
environment:
- MONGO_INITDB_ROOT_USERNAME=AzureDiamond
- MONGO_INITDB_ROOT_PASSWORD=hunter2
volumes: # this persists MongoDB data between restarts
- "./mongodb:/data/db"
Then in my repo root, in the package.json
file I have these relevant parts:
{
"scripts": {
"local": "run-p local:*",
"local:docker": "cd deploy && docker compose up",
"local:mongodb-data-api": "mongodb-local-data-api --username=AzureDiamond --password=hunter2 --apiKey=battery-horse-staple --apiPort=3007"
},
"devDependencies": {
"mongodb-local-data-api": "^1.0.0",
"npm-run-all": "^4.0.0"
}
}
Then when you do npm run local
it launches the Docker container (using docker-compose) and the local Data API, in parallel.
You might also be interested in @saibotsivad/mongodb
which is a thin wrapper to interact with a MongoDB Atlas Data API instance:
import { mongodb } from '@saibotsivad/mongodb'
const db = initializeMongodb({
apiUrl: process.env.MONGODB_API_URL,
apiKey: process.env.MONGODB_API_KEY,
dataSource: process.env.MONGODB_DATA_SOURCE,
database: process.env.MONGODB_DATABASE_NAME,
collection: process.env.MONGODB_COLLECTION_NAME,
})
const { documents } = await db.findOne({
filter: {
text: 'Do the dishes',
},
})
Published and released under the Very Open License.
If you need a commercial license, contact me here.