dyson
Node server for dynamic, fake JSON.
npm install dyson
See installation notes. Check out some demo services.
Introduction
Dyson allows you to define JSON endpoints based on a simple template
object:
When developing client-side applications, for data usually either static JSON files are used, or an actual server, backend, datastore, API, you name it. Sometimes static files are too static, and sometimes an actual server is not available, not accessible, or too tedious to setup.
This is where dyson comes in. Get a full fake server for your application up and running in minutes.
Overview
- Easy configuration, extensive options
- Dynamic responses
- Responses can use request data (e.g. to simulate different login scenarios based on username):
- Request path
- GET/POST parameters
- Cookies
- Respond with different status code for specific requests (e.g. 404 for
?id=999
) - Includes random data generators
- Responses can use request data (e.g. to simulate different login scenarios based on username):
- Supports to proxy non-configured endpoints to actual services
- Supports GET, POST, PUT, DELETE, PATCH (and OPTIONS)
- Supports CORS
- Includes dummy image generator
- Use any external or local image service (included)
- Supports base64 encoded image strings
- Supports required parameter validation
Endpoint Configuration
Configure endpoints using simple objects:
{
path: '/user/:id',
method: 'GET',
template: {
id: function(params, query, body) {
return params.id;
},
name: g.name,
address: {
zip: g.zipUS,
city: g.city
}
}
}
The path
string is the usual argument provided to Express, as in app.get(path, callback);
.
The template
object may contain properties of the following types:
- function: the function will be invoked with arguments (params, query, body, cookies)
- string, boolean, number, array: returned as-is
- object: will be recursively iterated
- promise: if the function is a promise, it will be replaced with the resolving value
Note: the template
can also be a function returning the actual data. The template function itself is also invoked with arguments (params, query, body, cookies).
Images
In addition to configured endpoints, dyson registers a dummy image service at /image
. E.g. requesting /image/300x200
serves an image with given dimensions.
This service is a proxy to Dynamic Dummy Image Generator by Russell Heimlich.
Defaults
The default values for the configuration objects:
{
cache: true,
proxy: false,
size: function() {
return _.random(2,10);
},
collection: false,
callback: response.generate,
render: response.render
};
cache:true
means that multiple requests to the same path will result in the same responseproxy:false
means that requests to this file can be skipped and sent to the configured proxysize:function
is the number of objects in the collectioncollection:true
will return a collectioncallback:function
- the provided default function is doing the hard work (but can be overridden)
- used as middleware in Express
- must set
res.body
and callnext()
to render response
render:function
- the default function to render the response (basically
res.send(200, res.body);
) - used as middleware in Express
- the default function to render the response (basically
Fake data generators
You can use anything to generate data. Here are some suggestions:
Just install the generator(s) in your project to use them in your templates:
npm install dyson-generators --save-dev
Please refer to the project pages for usage and examples (here's one using dyson-generators).
Containers
Containers can help if you need to send along some meta data, or wrap the response data in a specific way. Just use the container
object, and return the data
where you want it. Functions in the container
object are invoked with arguments (params, query, data):
{
path: '/users',
template: user.template,
container: {
meta: function(params, query, data) {
userCount: data.length
},
data: {
all: [],
the: {
way: {
here: function(params, query, data) {
return data;
}
}
}
}
}
}
And an example response:
{
"meta": {
"userCount": 2
},
data: {
all: [],
the: {
way: {
here: [
{
"id": 412,
"name": "John"
},
{
"id": 218,
"name": "Olivia"
}
]
}
}
}
}
Combined requests
Basic support for "combined" requests is available, by means of a comma separated path fragment.
For example, a request to /user/5,13
will result in an array of the responses from /user/5
and /user/13
.
The ,
delimiter can be configured (or disabled).
Status codes
By default, all responses are sent with a status code 200
(and the Content-Type: application/json
header).
This can be completely overridden with the status
property, e.g.:
{
path: '/feature/:foo?',
status: function(req, res) {
if(req.params.foo === '999') {
res.send(404).body('Feature not found');
}
}
}
Would result in a 404
when requesting /feature/999
.
Installation
The recommended way to install dyson is to install it locally and put it in your package.json
:
npm install dyson
Then you can use it from an npm-script
in package.json
using e.g. npm run mocks
:
"scripts": {
"mocks": "dyson stubs"
}
You can also install dyson globally to start it from anywhere:
npm install -g dyson
Project
You can put your configuration files anywhere, but either the configuration must have the method
property set or the configuration file must be inside a directory representing the method (e.g. stubs/get/sub/endpoint.js
). Then start the server:
dyson [dir]
This starts the services configured in [dir]
at localhost:3000.
You can also provide an alternative port number by just adding it as a second argument (e.g. dyson path/ 8181
).
dyson init
For convenience, you could generate some dummy templates to get started inside a project directory:
dyson init [dir]
This script copies dummy config files to [dir]/get/
, [dir]/post/
, [dir]/put/
, and [dir]/delete/
.
Demo
For a demo project, see webpro/dyson-demo. This demo is also running at nodejitsu.
Project Configuration
Optionally, you can put a dyson.json
file next to the configuration folders (inside [dir]
). It enables to configure some behavior of dyson:
{
"multiRequest": ",",
"proxy": true,
"proxyHost": "http://dyson.jit.su",
"proxyPort": 8080
}
- Setting
multiRequest
tofalse
disables the combined requests feature. - By default, the
proxy
is set tofalse
Development & run tests
git clone git@github.com:webpro/dyson.git
cd dyson
npm install
npm test
Articles about dyson
- Stubbing Network Calls (Api) Using Dyson for Emberjs Apps
- Our Ember.js Toolchain
- Dyson, construye un servidor de pruebas que devuelva fake JSON para simular una API
- Mockear la capa back con Dyson