Express middleware for scripted processing using JSONScript
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Express middleware for batch processing using JSONScript.

Build Status npm version Code Climate Coverage Status


npm install jsonscript-express

Getting started

Sample express app:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var jsonscript = require('jsonscript-express');

// app needs body parser for JSON even if no endpoint uses it.
// it is needed for JSONScript middleware

app.get('/api/resource/:id', function (req, res) {
  // ...
});'/api/resource', function (req, res) {
  // ...

 * The line below adds JSONScript interpreter on the endpoint '/js'
 * that allows processing any scripts combining existing enpoints
 */'/js', jsonscript(app, { basePath: '/api' }));


Now you can send POST requests to /js endpoint with the body containing the script and an optional data instance that will be processed by JSONScript interpreter. For example, with this request:

  "script": {
    "res1": { "$$router.get": { "path": "/resource/1" } },
    "res2": { "$$router.get": { "path": "/resource/2" } }

the response will be a combination of two responses (both requests are processed in parallel):

  "res1": {
    "statusCode": 200,
    "headers": { /* response headers for the 1st request */ },
    "request": { "method": "get", "path": "/resource/1" },
    "body": { /* response body 1 */ }
  "res2": {
    "statusCode": 200,
    "headers": { /* response headers for the 2nd request */ },
    "request": { "method": "get", "path": "/resource/2" },
    "body": { /* response body 2 */ }

If option processResponse: "body" were used the result would have been:

  "res1": { /* response body 1 */ },
  "res2": { /* response body 2 */ }

JSONScript also supports sequential evaluation, conditionals, data manipulation, functions etc. So you can implement an advanced logic in your script and it will be executed in the server without sending responses of individual requests to the client.

See JSONScript Language for more information.


jsonscript(Express app [, Object options]) -> Function

Create express route handling function to process JSONScript. Both the script and the data instance should be properties of the request body:

  "script": {
    // JSONScript, can be an array
  "data": {
    // data instance that can be used from the script,
    // can be array



  routerExecutor: 'router',
  basePath: '',
  processResponse: undefined,
  jsonscript: { strict: true },
  Promise: undefined
  • routerExecutor: the name of the executor (the value of "$exec" keyword in the instruction) used to access Express router, "router" is used by default.
  • basePath: the path used as a prefix to paths in the script $exec instruction arguments.
  • processResponse: possible values:
    • "body" - return only response body if status code is < 300, throw an exception otherwise.
    • function - custom function to process the response object, can throw an exception or return the object to be used as the result.
  • jsonscript: options passed to JSONScript interpreter jsonscript-js.
  • Promise: an optional Promise class, the native Promise is used by default.