mocker-api is a free, open source api development & testing project written in TypeScript and released under MIT. It has 501 GitHub stars, 65 forks and 27 open issues, and was last pushed 7 months ago. On this registry it ranks #184 of 187 tracked projects in API Development & Testing, with 5 head-to-head comparisons available.

What is mocker-api?

mocker-api is an MIT-licensed TypeScript tool that creates mock endpoints for REST APIs, built for developers who need to test an application without running the actual REST API server.

What it is

mocker-api is a Node.js package that runs a local HTTP server from a single configuration file and answers requests with the mock responses you define. It lives in the npm ecosystem and is distributed as mocker-api, with a command-line entry point named mocker and a programmatic entry point exposed as apiMocker(app, path, option). The project is written in TypeScript, licensed under MIT, and ships a documentation site at https://jaywcjlove.github.io/mocker-api. It carries topics such as mock-server, mock-data, mockjs, mockup, webpack and webpack-dev-server, which reflects where it is most often used: front-end projects whose build tooling already runs a development server.

The concrete problem it solves is the missing or unfinished backend. When a REST API server is unavailable, still under construction, or too slow to exercise repeatedly, mocker-api stands in for it by serving your own fixtures and route handlers over HTTP. The configuration file replaces the real service: paths such as /api/user and /api/user/list return the objects and arrays written in api.js, and method-prefixed keys such as GET /api/user, POST /api/login/account and DELETE /api/user/:id let a single file describe a whole surface. It also handles the case where only part of a backend exists, because proxy rules forward selected paths to a real upstream while the remaining paths stay mocked.

Key capabilities

  • A single configuration file, conventionally api.js or mocker/index.js, defines all routes; bare keys such as /api/user default to GET, and explicit keys such as GET /api/user/list, POST /api/login/account and DELETE /api/user/:id select the HTTP method.
  • Route handlers receive Express-style request and response objects, so req.body, req.params and res.status(403).json(...) work inside a mock, as shown by the login example that returns { status: 'ok', code: 0, token: 'sdfsdfsdfdsf' } on success.
  • Parameterized and wildcard paths are supported through path-to-regexp syntax, for example GET /api/:owner/:repo/raw/:ref/*path, which exposes owner, repo, ref and req.params.path to the handler.
  • Proxy rules under the _proxy.proxy key map a path string to an upstream, such as '/repos/*path': 'https://api.github.com/' or a local service at http://127.0.0.1:3721/, with changeHost: true to set the request host header.
  • pathRewrite rewrites the target URL path, with object keys used as regular expressions, for example '^/api/repos/': '/repos/'.
  • httpProxy passes options and listeners to http-proxy, including ignorePath: true and a proxyReq listener callback.
  • Built-in hot Mocker file replacement, so the configuration file can be edited while the mock server keeps running, plus a priority option choosing between proxy and mocker and a withFullUrlPath option for matching full URL paths such as /test?a=1&b=1.

Who uses it and how

  • Front-end developers who need to build and test screens before a backend exists, wiring fixtures into api.js and running the mock on a chosen port.
  • Projects already using webpack or webpack-dev-server, where mocker-api is mounted into the existing dev server through apiMocker(app, path, option) instead of starting a second process.
  • Teams mocking only the unfinished part of a service, proxying the rest: one rule sends /repos/*path to https://api.github.com/ while other paths stay local.
  • Developers who prefer no build-tool coupling at all, since the package runs independently of webpack and webpack-dev-server and can be launched from the command line instead.
  • Manual and exploratory testing workflows where a controlled response is needed, including deliberate failure cases such as returning HTTP 403 when a password and username pair does not match.

Getting started

Install globally with npm install mocker-api -g, or add it to a project as a development dependency with npm install mocker-api --save-dev. Create a configuration file such as api.js and start the server with mocker ./api.js, which listens on port 3721 by default and accepts --host and --port to change the address, for example mocker ./api.js --host localhost --port 8000.

How it compares

No list of paid products is provided in the facts, so the closest named neighbours are the tools the README positions the package against: webpack and webpack-dev-server, which it can plug into but does not require, and the http-proxy and path-to-regexp packages it builds on. In that setting it is the mocking layer rather than the build layer, and it can run as a standalone mocker ./api.js process when no bundler is present.

When to use it — and when not to

A self-hoster runs a Node.js process from a local configuration file, and the facts mention no database, object storage, SMTP or other backing service to operate, so the running cost is small but the operational control remains entirely with the user. It is a poor fit for anyone who needs a managed or hosted mocking service, or a full contract-testing suite, since the facts describe only a local server driven by a configuration file. The honest caveats are that the repository is modest in size at roughly 500 stars and 64 forks with 27 open issues, and that the README excerpt is short and leans on the linked documentation site, so a prospective adopter should read the fuller docs before committing to it.

project readme (upstream, from github) — read inline

Using my app is also a way to support me:
Scap: Screenshot & Markup Edit Screen Test Deskmark Keyzer Vidwall Hub VidCrop Vidwall Mousio Hint Mousio Musicer Audioer FileSentinel FocusCursor Videoer KeyClicker DayBar Iconed Menuist Quick RSS Quick RSS Web Serve Copybook Generator DevTutor for SwiftUI RegexMate Time Passage Iconize Folder Textsound Saver Create Custom Symbols DevHub Resume Revise Palette Genius Symbol Scribe


Mocker API LOGO

Buy me a coffee Follow On X Build & Deploy Download
Repo Dependents Open in unpkg npm version

中文 · Quick Start · Usage · Options · Delayed · Example · License · type

mocker-api creates mocks for REST APIs. It is helpful when you need to test your application without the actual REST API server.

Features:

🔥 Built-in support for hot Mocker file replacement.
🚀 Quickly and easily configure the API via JSON.
🌱 Mock API proxying made simple.
💥 Can be used independently without relying on webpack and webpack-dev-server.

Quick Start

mkdir mocker-app && cd mocker-app

# Create a mocker configuration file based on rules
touch api.js

# Global install dependent.
npm install mocker-api -g

# Default port: 3721
mocker ./api.js

# Designated port
# Run server at localhost:8000
mocker ./api.js --host localhost --port 8000

Installation

you can put it the package.json config as a current project dependency.

npm install mocker-api --save-dev

Usage

mocker-api dev support mock, configured in mocker/index.js.

you can modify the http-proxy options and add the event listeners by adding the httpProxy configuration

const proxy = {
  // Priority processing.
  // apiMocker(app, path, option)
  // This is the option parameter setting for apiMocker
  _proxy: {
    proxy: {
      // Turn a path string such as `/user/:name` into a regular expression.
      // https://www.npmjs.com/package/path-to-regexp
      '/repos/*path': 'https://api.github.com/',
      '/:owner/:repo/raw/:ref/*path': 'http://127.0.0.1:2018',
      '/api/repos/*path': 'http://127.0.0.1:3721/'
    },
    // rewrite target's url path. Object-keys will be used as RegExp to match paths.
    // https://github.com/jaywcjlove/mocker-api/issues/62
    pathRewrite: {
      '^/api/repos/': '/repos/',
    },
    changeHost: true,
    // modify the http-proxy options
    httpProxy: {
      options: {
        ignorePath: true,
      },
      listeners: {
        proxyReq: function (proxyReq, req, res, options) {
          console.log('proxyReq');
        },
      },
    },    
  },
  // =====================
  // The default GET request.
  // https://github.com/jaywcjlove/mocker-api/pull/63
  '/api/user': {
    id: 1,
    username: 'kenny',
    sex: 6
  },
  'GET /api/user': {
    id: 1,
    username: 'kenny',
    sex: 6
  },
  'GET /api/user/list': [
    {
      id: 1,
      username: 'kenny',
      sex: 6
    }, {
      id: 2,
      username: 'kenny',
      sex: 6
    }
  ],
  'GET /api/:owner/:repo/raw/:ref/*path': (req, res) => {
    const { owner, repo, ref } = req.params;
    // http://localhost:8081/api/admin/webpack-mock-api/raw/master/add/ddd.md
    // owner => admin
    // repo => webpack-mock-api
    // ref => master
    // req.params.path => add/ddd.md
    return res.json({
      id: 1,
      owner, repo, ref,
      path: req.params.path
    });
  },
  'POST /api/login/account': (req, res) => {
    const { password, username } = req.body;
    if (password === '888888' && username === 'admin') {
      return res.json({
        status: 'ok',
        code: 0,
        token: "sdfsdfsdfdsf",
        data: {
          id: 1,
          username: 'kenny',
          sex: 6
        }
      });
    } else {
      return res.status(403).json({
        status: 'error',
        code: 403
      });
    }
  },
  'DELETE /api/user/:id': (req, res) => {
    console.log('---->', req.body)
    console.log('---->', req.params.id)
    res.send({ status: 'ok', message: '删除成功!' });
  }
}
module.exports = proxy;

Options

  • proxy => {} Proxy settings, Turn a path string such as /user/:name into a regular expression.
  • pathRewrite => {} rewrite target's url path. Object-keys will be used as RegExp to match paths. #62
  • withFullUrlPath=false => Boolean the proxy regular expression support full url path. if the proxy regular expression like /test?a=1&b=1 can be matched. #25
  • priority => proxy priority proxy or mocker #151
  • changeHost => Boolean Setting req headers host.
  • httpProxy => {} Set the listen event and configuration of http-proxy
  • bodyParserJSON JSON body parser
  • bodyParserText Text body parser
  • bodyParserRaw Raw body parser
  • bodyParserUrlencoded URL-encoded form body parser
  • bodyParserConf => {} bodyParser settings. eg: bodyParserConf : {'text/plain': 'text','text/html': 'text'} will parsed Content-Type='text/plain' and Content-Type='text/html' with bodyParser.text
  • watchOptions => object Options object as defined chokidar api options
  • header => {} Access Control Allow options.
    {
      header: {
        'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT, DELETE',
      }
    }
    

⚠️ No wildcard asterisk * - use parameters instead (.*), support v1.7.3+

⚠️ No wildcard asterisk (.*) - use parameters instead *path, support v3.0.0+

Delayed Response

You can use functional tool to enhance mock. #17

const delay = require('mocker-api/delay');
const noProxy = process.env.NO_PROXY === 'true';

const proxy = {
  'GET /api/user': {
    id: 1,
    username: 'kenny',
    sex: 6
  },
  // ...
}
module.exports = (noProxy ? {} : delay(proxy, 1000));

apiMocker

apiMocker(app, mockerFilePath[, options])
apiMocker(app, Mocker[, options])

Multi entry mocker file watching

const apiMocker = require('mocker-api');
const mockerFile = ['./mock/index.js'];
// or
// const mockerFile = './mock/index.js';
apiMocker(app, mockerFile, options)

Example

Using With Command

Base example

⚠️ Not dependent on webpack and webpack-dev-server.

# Global install dependent.
npm install mocker-api -g
# Run server
mocker ./mocker/index.js

Or you can put it the package.json config as a current project dependency.

{
  "name": "base-example",
  "scripts": {
+    "api": "mocker ./mocker"
  },
  "devDependencies": {
+    "mocker-api": "2.9.5"
  },
+  "mocker": {
+    "port": 7788
+  },
  "license": "MIT"
}

Using With Express

Express example

To use api mocker on your express projects.

⚠️ Not dependent on webpack and webpack-dev-server.

const express = require('express');
+ const path = require('path');
+ const apiMocker = require('mocker-api');

const app = express();

+ apiMocker(app, path.resolve('./mocker/index.js'))
app.listen(8080);

or

const express = require('express');
+ const apiMocker = require('mocker-api');

const app = express();

+ apiMocker(app, {
+   'GET /api/user': {
+     id: 1,
+     sex: 0
+   }
+ });

app.listen(8080);

Using With Webpack

webpack example

To use api mocker on your Webpack projects, simply add a setup options to your webpack-dev-server options:

Change your config file to tell the dev server where to look for files: webpack.config.js.

const HtmlWebpackPlugin = require('html-webpack-plugin');
+ const path = require('path');
+ const apiMocker = require('mocker-api');

module.exports = {
  entry: {
    app: './src/index.js',
  },
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
+ devServer: {
+   ...
+   before(app){
+     apiMocker(app, path.resolve('./mocker/index.js'), {
+       proxy: {
+         '/repos/*path': 'https://api.github.com/',
+         '/:owner/:repo/raw/:ref/*path': 'http://127.0.0.1:2018'
+       },
+       changeHost: true,
+     })
+   }
+ },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve('./public/index.html'),
      title: 'Webpack App Mocker API'
    })
  ],
};

Must have a file suffix! For example: ./mocker/index.js.

Let's add a script to easily run the dev server as well: package.json

{
  "name": "development",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
+    "start": "webpack serve --progress --mode development",
    "build": "webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "html-webpack-plugin": "4.5.0",
    "mocker-api": "2.9.5",
    "webpack": "5.22.0",
    "webpack-cli": "4.5.0",
    "webpack-dev-server": "3.11.2"
  }
}

Mock API proxying made simple.

{
  before(app){
+   apiMocker(app, path.resolve('./mocker/index.js'), {
+     proxy: {
+       '/repos/*path': 'https://api.github.com/',
+     },
+     changeHost: true,
+   })
  }
}

Using With create-react-app

create-react-app example

To use api mocker on your create-react-app projects. create src/setupProxy.js and place the following contents in it:

+ const apiMocker = require('mocker-api');
+ const path = require('path');

module.exports = function(app) {
+  apiMocker(app, path.resolve('./mocker/index.js'), {
+    proxy: {
+      '/repos/*path': 'https://api.github.com/',
+    },
+    changeHost: true,
+  });
};
{
  .....
  "devDependencies": {
+    "mocker-api": "2.9.5"
  },
  ....
}

Development

$ yarn install
$ yarn run build
$ yarn run watch
$ yarn run test

Contributors

As always, thanks to our amazing contributors!

Made with github-action-contributors.

License

MIT © Kenny Wong

Frequently asked questions

Is mocker-api free to use?

mocker-api is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does mocker-api do?

mocker-api that creates mocks for REST APIs. It will be helpful when you try to test your application without the actual REST API server.

What is mocker-api written in?

mocker-api is primarily written in TypeScript. Its source is publicly available at https://github.com/jaywcjlove/mocker-api, and it has 501 GitHub stars.