all repos — litestore @ bd2fa1c09df1591de45af167a5d4587b1b0cc578

A minimalist nosql document store.

src/admin/md/middleware.md

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
## Middleware

As of version 1.8.0, you can define your own custom resources using handlers coded in JavaScript.

LiteStore embeds the [duktape](https://duktape.org/) lightweight JavaScript engine and therefore you can use all functionalities exposed by duktape in your code, plus access some LiteStore-specific properties and method through the special **LiteStore** global object.

Although writing extremely complex logic in a JavaScript handler may not be appropriate, it can be useful for certain use cases, such as:
* validating data before it is saved
* manipulate data before it is saved
* aggregating different types of data not accessible via a single query
* perform additional operation when accessing data, such as logging who requested it

### Creating a JavaScript Handler

Let's say you want to keep records of Italian vehicles identified by their number plate, which is in the following format:

\[two-uppercase-letters\][three-digits\][two-uppercase-letters\]

For example: AB467DX (OK, in reality there's a space between each set of digits/letters, but spaces in identifiers are ugly, so let's remove them!)

Let's also say that Italian vehicle data will be managed by a custom resource called **vehicles**, therefore vehicles will be accessible at URLs similar to the following:

* http://localhost:9500/docs/vehicles/AB467DX
* http://localhost:9500/docs/vehicles/CD569BW
* http://localhost:9500/docs/vehicles/EF981DE

To make sure that valid IDs are used, we can create a file called **vehicles.js** and write the following handler code that intercepts all requests to that specific folder and:

* denies POST requests
* returns an error in case of an invalid ID specified on a PUT request
* allows the request through otherwise

```
if (LiteStore.request.method === 'POST') {
  LiteStore.response.code = 405;
  LiteStore.response.content = JSON.stringify({error: 'No number plate specified.'});
  return;
}
if (LiteStore.request.method === 'PUT' && !LiteStore.request.path.match(/[A-Z]{2}[0-9]{3}[A-Z]{2}$/) {
  LiteStore.response.code = 400;
  LiteStore.response.content = JSON.stringify({error: 'Invalid number plate.'});
  return;
}

LiteStore.passthrough();
```


### Mounting a Handler as a Custom Resource