DEV Community

Aditya Kresna
Aditya Kresna

Posted on

[NodeJS] Simple Express Response Hijack/Interceptor Library

So this is a short introduction about my express-multi-hijack library that I just published a few minutes ago. express-multi-hijack is a simple express middleware for hijacking or intercept Your HTTP or API responses.

It's based on my experience when I want to intercept JSON Api response. This library might be useful for your use-case with your NodeJS or Typescript project (yes, it is typescript friendly) when it needs an interception on response body

Installation

npm i express-multi-hijack

How It Works

This library works by overriding res.end function, still maintaining the original one once all of the "hijack" functions are executed.
So it is safe to use with Your own custom res.end implementation.

Some Examples

Simple Tracing Response Body

const Express = require('express');
const { Hijack } = require('express-multi-hijack');

const app = Express()

app.use(Hijack({
  json: true,
  handler: (body, req, res, next) => {
    console.info('got response body', body) // { "foo": "bar" }
  }
}))

app.get('/bar', (req, res, next) => {
  res.json({
    bar: 'foo',
  })
})

app.get('/foo', (req, res, next) => {
  res.json({
    foo: 'bar',
  })
})

app.listen(8080)
Enter fullscreen mode Exit fullscreen mode

Based on the example above, the hijack handler will print { "foo": "bar" } on request to localhost:8080/foo and { "bar": "foo" } when requesting to localhost:8080/bar.

Intercept / Hijack Response Body

const Express = require('express')
const { Hijack } = require('../dist')

const app = Express()

app.use(Hijack({
  json: true,
  handler: (body, _, res) => {
    console.info('body:', body)
    res.json({ message: 'Today is the bad day' })
  }
}))

app.get('/', (_, res) => {
  return res.json({ message: 'Today is a Great Day!' })
})

app.listen(8080)
Enter fullscreen mode Exit fullscreen mode

The code above will change the response message from 'Today is a Great Day!' to 'Today is the bad day'

Multiple Hijack, early hijack function got highest priority

const Express = require('express')
const { Hijack } = require('../dist')

const app = Express()

// hijack on monday
app.use(Hijack({
  json: true,
  handler: (body, _, res) => {
    if (body.today === 'Monday') {
      res.json({
        ...body,
        message: 'What a lazy day'
      })
    }
  }
}))

// hijack on friday
app.use(Hijack({
  json: true,
  handler: (body, req, res) => {
    if (req.path === '/friday') {
      res.json({
        ...body,
        message: 'What a wondeful day'
      })
    }
  }
}))

app.get('/', (_, res) => res.json({ message: 'No Hijack' }))

app.get('/monday', (_, res) => {
  return res.status(200).json({ today: 'Monday', message: 'Today is a Great Day!' })
})

app.get('/friday', (_, res) => {
  return res.status(200).json({ message: 'Today is a Great Day!' })
})

app.listen(8080)
Enter fullscreen mode Exit fullscreen mode

The code above will intercept and change response for localhost:8080/monday to {today: 'Moday', message: 'What a lazy day'}, and localhost:8080/friday to {message: 'What a wondeful day'}

That's all, thank you for reading my post, for more code examples You can visit the example directory.

This post originally published here

Top comments (0)