Originally posted on November 13th, 2017 (more info)
In a follow up to my last post, the following code takes an Express request, performs an external request, stores that response in a buffer which it then stores in Redis, which it then reads back, converts back into a buffer and sends that back to the Express response.
This doesn't store the headers or status code in Redis but it could easily be done.
This allows playback of a request/response cycle. Interesting concept really.
'use strict'
const express = require('express')
const request = require('request')
const streamBuffers = require('stream-buffers')
const through2 = require('through2')
const redis = require('redis')
const client = redis.createClient()
client.on('connect', () => { console.log('redis connected' )})
client.on('ready', () => { console.log('redis ready' )})
client.on('reconnecting', () => { console.log('redis reconnecting' )})
client.on('error', () => { console.log('redis error' )})
client.on('end', () => { console.log('redis end' )})
const app = express()
app.use('/', (incomingRequest, outgoingResponse) => {
const outgoingRequest = request('http://via.placeholder.com/800x600?text=example')
const randomKey = Math.random().toString(36).substr(2)
const stream = new streamBuffers.WritableStreamBuffer()
let _statusCode = null
let _headers = null
outgoingRequest.pipe(through2(function (chunk, enc, callback) {
stream.write(chunk)
callback()
}))
outgoingRequest.on('end', () => {
const contents = stream.getContents()
const base64 = contents.toString('base64')
client.set(randomKey, base64)
client.get(randomKey, (err, reply) => {
const newBuffer = new Buffer(reply, 'base64')
outgoingResponse.set(_headers).status(_statusCode)
outgoingResponse.end(newBuffer)
client.del(randomKey)
})
})
outgoingRequest.on('response', (incomingResponse) => {
_statusCode = incomingResponse.statusCode
_headers = incomingResponse.headers
})
})
app.listen(8000, () => {
console.log('listening on 8000')
})
Top comments (0)