Skip to main content
Version: 0.5.0 (Previous)

⚡ Quickstart

This hands-on tutorial gets you from zero to running API in less than 5 minutes.

We will create a minimal Express server exposing the ready-made Authentication Service and User Service backed by MongoDB.


📋 Prerequisites​

Before we start, make sure you have the following installed on your system:

  • Node.js (v18 or higher)
  • Docker and Docker Compose (for MongoDB)
  • npm or yarn (package manager)

1️⃣ Create Project Directory​

First, create a new directory for your quickstart project and navigate into it:

mkdir quickstart
cd quickstart

2️⃣ Install Dependencies​

npm install express@^4.19.0 mongodb @nodeblocks/backend-sdk
npm install -D typescript ts-node @types/node @types/express@^4.17.0

📝 Important: Don't forget to add your .npmrc file with the authentication token to access the private @nodeblocks/backend-sdk package.

⚠️ Compatibility: The Nodeblocks Backend SDK is compatible with Express v4.x and requires TypeScript for optimal development experience.

Using Local Development Version​

If you need to use the latest local development version of the SDK, follow these steps:

  1. Clone and build the SDK locally:
git clone <sdk-repository-url>
cd nodeblocks-backend-sdk
npm install
npm run build
npm link
  1. In your quickstart project, link to the local version:
npm link @nodeblocks/backend-sdk
  1. To switch back to the published version:
npm unlink @nodeblocks/backend-sdk
npm install @nodeblocks/backend-sdk

3️⃣ Initialize TypeScript​

Create a TypeScript configuration file to enable proper compilation and type checking:

npx tsc --init

This will generate a tsconfig.json file. You can use the default configuration, or customize it according to your project needs.


4️⃣ Setup MongoDB with Docker Compose​

Create docker-compose.yml in your project root directory with following content:

services:
mongodb:
image: mongo:7
container_name: mongodb
ports:
- "27017:27017"
restart: always
environment:
MONGO_INITDB_DATABASE: dev

💡 Security Note: For production environments, you can protect your database by adding authentication. Include MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD environment variables in your Docker Compose configuration.

Start MongoDB in detached mode:

docker-compose up -d

5️⃣ Bootstrap the Server​

Create /index.ts with the minimal setup to run both authentication and user services:

import express from 'express';

import { middlewares, services, drivers } from '@nodeblocks/backend-sdk';

const { nodeBlocksErrorMiddleware } = middlewares;
const { authService, userService } = services;
const { getMongoClient } = drivers;

const client = getMongoClient('mongodb://localhost:27017', 'dev');

// Authentication Service - handles user registration, login, and token management
express()
.use(
authService(
{
identities: client.collection('identities'),
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret',
authSignSecret: 'your-signing-secret',
},
},
),
userService(
{
users: client.collection('users'),
identities: client.collection('identities'),
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret',
authSignSecret: 'your-signing-secret',
},
}
)
)
.use(nodeBlocksErrorMiddleware())
.listen(8089, () => console.log('Server running on http://localhost:8089'));

⚠️ Critical: The nodeBlocksErrorMiddleware() is essential! Without it, your API will return HTML error pages instead of JSON responses when errors occur. Always include it after your services.

🔑 Authentication Setup: The authentication service provides endpoints for user registration, login, and invitation management. The user service requires valid authentication tokens to access its endpoints.


6️⃣ Build and Run the Server​

Compile the TypeScript code and start the server:

npx tsc
node index.js

You should see the following output:

Server running on http://localhost:8089

Your API server is now running with both authentication and user services!


7️⃣ Test the Authentication Flow​

Step 1: Register a User​

First, create a user account through the authentication service:

curl -X POST http://localhost:8089/auth/register \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"password": "securepassword123"
}'

Step 2: Login to Get Access Token​

Login with the registered user to get an access token:

curl -X POST http://localhost:8089/auth/login \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"password": "securepassword123"
}'

You should receive a response with an access, refresh tokens and identity id:

{
"accessToken": "77c268e06d87594067d91c5b2f08e532...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"id": "f792cde5-958b-49e9-bf83-13d59c1e35c0"
}

Step 3: Use the Access Token​

Now you can use the access token to access the user service endpoints:

# Create user profile
curl -X POST http://localhost:8089/users/ \
-H 'Authorization: Bearer <access-token>' \
-H 'Content-Type: application/json' \
-d '{"email":"user@example.com","name":"John","status":"active"}'

You should receive a JSON response similar to the following:

{
"id": "922ebcee-159f-4c92-8f2c-2599d7ed1680",
"email": "user@example.com",
"name": "John",
"status": "active",
"createdAt": "2025-06-18T06:19:55.974Z",
"updatedAt": "2025-06-18T06:19:55.974Z"
}

🚨 Understanding Error Handling​

Try making an invalid request to see the error middleware in action:

# Missing required fields - triggers validation error
curl -X POST http://localhost:8089/users \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <bearer-token-from-auth-service>' \
-d '{"email":"john@example.com"}'

With nodeBlocksErrorMiddleware() (✅ Correct):

{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'name'",
"request body must have required property 'status'"
]
}
}

Without nodeBlocksErrorMiddleware() (❌ Wrong):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>NodeblocksError: Validation Error<br> --error stack--</pre>
</body>
</html>

💡 Key Point: The error middleware transforms all errors into consistent JSON responses, making your API client-friendly.


🎉 What You've Built​

Congratulations! ✨ You now have a fully-featured REST API with:

  • Authentication system with user registration and login
  • JWT token management with access and refresh tokens
  • CRUD operations for users (Create, Read, Update, Delete)
  • Automatic validation using JSON Schema
  • MongoDB integration with proper connection handling
  • JSON error responses with proper HTTP status codes
  • TypeScript support for type safety

🔗 Available Endpoints​

Authentication Service (/auth)​

  • POST /auth/register - Register a new user
  • POST /auth/login - Login and get access token
  • POST /auth/logout - Logout and invalidate tokens

User Service (/users) - Requires Authentication​

  • POST /users - Create a new user (admin only)
  • GET /users - List all users (admin only)
  • GET /users/:userId - Get user by ID (admin or self)
  • PATCH /users/:userId - Update user (admin or self)
  • DELETE /users/:userId - Delete user (admin or self)
  • POST /users/:userId/lock - Lock a user account (admin only)
  • POST /users/:userId/unlock - Unlock a user account (admin only)

🔐 Authentication Flow​

  1. Register a user account via /auth/register
  2. Login to get access and refresh tokens via /auth/login
  3. Use access token in Authorization: Bearer <token> header for protected endpoints

➡️ Next Steps​