Does http-proxy-middleware work with Serverless Lambda?
Asked Answered
W

2

6

I'm trying to proxy an external API through Serverless Lambda. Trying the following example for the code below: http://localhost:3000/users/1 returns 200 but body is empty. I must be overlooking something as http://localhost:3000/users/11 returns a 404 (as expected).

index.js

'use strict';
const serverless = require('serverless-http');
const express = require('express');
const {
  createProxyMiddleware
} = require('http-proxy-middleware');

const app = express();

const jsonPlaceholderProxy = createProxyMiddleware({
  target: 'http://jsonplaceholder.typicode.com',
  changeOrigin: true,
  logLevel: 'debug'
});

app.use('/users', jsonPlaceholderProxy);

app.get('/', (req, res) => {
  res.json({
    msg: 'Hello from Serverless!'
  })
})

const handler = serverless(app);
module.exports.handler = async (event, context) => {
  try {
    const result = await handler(event, context);
    return result;
  } catch (error) {
    return error;
  }
};

serverless.yml

service: sls-proxy-test

provider:
  name: aws
  runtime: nodejs12.x

plugins:
  - serverless-offline

functions:
  app:
    handler: index.handler
    events:
      - http:
          method: ANY
          path: /
      - http: "ANY {proxy+}"

package.json

{
  "name": "proxy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "sls": "sls",
    "offline": "sls offline start"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "4.17.1",
    "http-proxy-middleware": "1.0.1",
    "serverless-http": "2.3.2"
  },
  "devDependencies": {
    "serverless": "1.65.0",
    "serverless-offline": "5.12.1"
  }
}
Winfield answered 8/3, 2020 at 15:47 Comment(0)
N
1

try to remove the transfer-encoding header from the response in onProxyRes listener inside createProxyMiddleware

const jsonPlaceholderProxy = createProxyMiddleware({
  onProxyRes: function (proxyRes, req, res) { // listener on response
    delete proxyRes.headers['transfer-encoding']; // remove header from response
  },
  // remaining code

Nae answered 26/3, 2021 at 22:7 Comment(0)
K
0

I had the same issue but adding the below onProxyRes option solved it

  onProxyRes(proxyRes, req, res) {
    const bodyChunks = [];
    proxyRes.on('data', (chunk) => {
      bodyChunks.push(chunk);
    });
    proxyRes.on('end', () => {
      const body = Buffer.concat(bodyChunks);
      res.status(proxyRes.statusCode);
      Object.keys(proxyRes.headers).forEach((key) => {
        res.append(key, proxyRes.headers[key]);
      });
      res.send(body);
      res.end();
    });
  }
Kodiak answered 2/7, 2020 at 18:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.