doctorsherlock
doctorsherlock

Reputation: 1374

How to forward a node request using axios?

In my express.js server I am doing this to forward a request to another server

async handleRequest(req, res) {
    const serverUrl = "http://localhost:4000"

    await req.pipe(request({ url: serverUrl + req.url })).pipe(res);
}

This is working as expected. But I have decided to use axios or got library instead of request since request is no longer maintained. But something like this is not working -

req.pipe(axios({url: serverUrl + req.url})).pipe(res);

I am getting error

(node:88124) UnhandledPromiseRejectionWarning: TypeError: dest.on is not a function
    at IncomingMessage.Readable.pipe (internal/streams/readable.js:671:8)

How can I fix this? I want to forward the request as it is without making any changes in the request object.

Upvotes: 5

Views: 4385

Answers (2)

Victor
Victor

Reputation: 3818

You may not need Axios at all. For me, the built-in http module was enough:

import { request } from 'http';

function handleRequest(req, res) {
    request(
        serverUrl + req.url,
        { method: req.method, headers: req.headers },
        response => {
            res.writeHead(response.statusCode || 200, response.statusMessage || 'OK', response.headers)
            response.pipe(res)
    }).end();
}

Upvotes: 0

Waelsy123
Waelsy123

Reputation: 612

You need to use responseType parameter with value stream so axios give you the option to pipe your response data as a stream by:

axiosResponse.data.pipe(destination); // where destination can be a file or another stream

Also, in fact there is no need to do await req.pipe because axios will stream the response into your express response (res) object

hence is the full answer:

  const axiosResponse = await axios({
    url: serverUrl + req.url,
    responseType: 'stream'
  })

  axiosResponse.data.pipe(res)

Upvotes: 5

Related Questions