Mocker API for RESTful Development

4.0.0 · active · verified Wed Apr 22

mocker-api is a development utility designed for mocking RESTful APIs, facilitating frontend development by enabling work independent of a live backend. It supports flexible integration as middleware with common development servers like Express.js and webpack-dev-server. The current stable version is 4.0.0, which has updated its Node.js requirement to `>=16.0.0`. The library features hot module replacement for mock files, allows quick API configuration via JSON or JavaScript files, and provides simple mock API proxying. It also offers first-class TypeScript type definitions for an enhanced developer experience. Unlike some other mocking solutions, `mocker-api` can be used independently without relying on a full webpack setup, making it versatile for various project types, including Create React App. It helps streamline development workflows by providing predictable API responses during the early stages of a project.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart sets up a basic Express server and integrates `mocker-api` as middleware. It demonstrates defining mock API routes in a separate file (e.g., `mocker/index.ts`), handling both static JSON responses and dynamic request/response logic, and includes an example of proxying unmocked requests to a real API like JSONPlaceholder or GitHub for a seamless development experience.

import express from 'express';
import path from 'path';
import apiMocker from 'mocker-api';

interface User { id: number; name: string; email: string; }

// --- Create 'mocker/index.ts' file in your project root or source directory ---
// const mocks = {
//   'GET /api/users': [
//     { id: 1, name: 'Alice', email: 'alice@example.com' },
//     { id: 2, name: 'Bob', email: 'bob@example.com' },
//   ],
//   'POST /api/users': (req, res) => {
//     const newUser: User = { id: Date.now(), ...req.body };
//     console.log('New user created:', newUser);
//     res.status(201).json(newUser);
//   },
//   'GET /api/user/:id': (req, res) => {
//     const userId = parseInt(req.params.id, 10);
//     const users: User[] = [
//       { id: 1, name: 'Alice', email: 'alice@example.com' },
//       { id: 2, name: 'Bob', email: 'bob@example.com' },
//     ];
//     const user = users.find(u => u.id === userId);
//     if (user) {
//       res.json(user);
//     } else {
//       res.status(404).json({ message: `User with ID ${userId} not found` });
//     }
//   },
//   'GET /api/posts': [
//     { id: 101, title: 'First Post' },
//     { id: 102, title: 'Second Post' },
//   ],
//   // Example of proxying specific requests: anything starting with /github/
//   'GET /github/*': 'https://api.github.com/',
// };
// export default mocks;
// -----------------------------------------------------------------------------

const app = express();
const port = process.env.PORT ?? 8080; // Use process.env.PORT or default to 8080

// Enable JSON body parsing for POST/PUT requests (essential for 'POST /api/users' mock)
app.use(express.json());

// Resolve the path to your mock definition file.
// Ensure 'mocker/index.js' or 'mocker/index.ts' exists and exports the mock definitions.
const mockDirectory = path.resolve(__dirname, 'mocker/index.js'); // Adjust for your build output

apiMocker(app, mockDirectory, {
  // Optional: Enable proxying for unmocked routes. Requests matching '/api/(.*)'
  // that are not explicitly mocked will be forwarded to JSONPlaceholder.
  proxy: {
    '/api/(.*)': 'https://jsonplaceholder.typicode.com/', 
  },
  // Set changeHost to true when proxying to external hosts like GitHub API to avoid CORS issues.
  changeHost: true,
  // Optional: Simulate network delay for all mock responses in milliseconds.
  delay: 500,
});

app.listen(port, () => {
  console.log(`Mock API Server is running at http://localhost:${port}`);
  console.log('Try visiting:');
  console.log(`- http://localhost:${port}/api/users (mocked data from 'mocker/index.ts')`);
  console.log(`- http://localhost:${port}/api/user/1 (mocked data from 'mocker/index.ts')`);
  console.log(`- http://localhost:${port}/api/todos/1 (proxied to JSONPlaceholder)`);
  console.log(`- http://localhost:${port}/github/users/jaywcjlove (proxied to GitHub API)`);
});

view raw JSON →