node.jsexpressproxy-server

Express JS proxy to call web api


I have the following code. And a web api which returns string array,

const express = require('express');
const proxy = require('express-http-proxy');


var app = express();

app.use('/proxy', proxy('http://localhost:56660/api/values'));

app.listen(3000);

When I tried to do localhost:3000/proxy I do not get a response, But when I use app.use('/proxy', proxy('www.google.com')); , it redirects to google web site.

Please suggest me a best approach/solution: I want to create a proxy server which gets url from browser (Application), modify the url, call the new url and send the response back to browser(Application).


Solution

  • You can get the URL to be proxied as a query parameter, modify it and then pass that URL to proxy, like this (use instead of app.use('/proxy', proxy('http://localhost:56660/api/values'));):

    app.get('/proxy', (req, res, next) => {
        const modifiedURL = modifyURL(req.query.url)
        return proxy(modifiedURL)(req, res, next)
    })
    

    You can call you server with an URL like this (GET method):

    https://my.server.com/proxy?url=https://urltobeproxied.com

    UPDATE:

    I think this would work according to your needs:

    app.use('/proxy', (req, res, next) => {
        const requestedUrl = `${req.protocol}://${req.get('Host')}${req.url}`
        const modifiedURL = modifyURL(requestedUrl)
        proxy(modifiedURL)(req, res, next)
    })
    

    UPDATE2:

    app.use('/proxy', proxy('http://localhost:56660/api/values', {
      proxyReqPathResolver: function(req) {
        const requestedUrl = `${req.protocol}://${req.get('Host')}${req.url}`
        const modifiedURL = modifyURL(requestedUrl)
        return require('url').parse(modifiedURL).path;
      }
    }))
    

    UPDATE3:

    An example of proxy modifying the response (extracted from the package docs);

    app.use('/proxy', proxy('http://localhost:56660/api/values', {
      userResDecorator: function(proxyRes, proxyResData, userReq, userRes) {
        data = JSON.parse(proxyResData.toString('utf8'));
        data.newProperty = 'exciting data';
        return JSON.stringify(data);
      }
    }))