http-proxy-middleware 是否可以与 Serverless Lambda 配合使用?

Cha*_*nge 5 proxy http aws-lambda http-proxy-middleware serverless

我正在尝试通过无服务器 Lambda 代理外部 API。尝试以下代码示例:http://localhost:3000/users/1返回 200 但正文为空。我必须忽略一些东西,因为http://localhost:3000/users/11返回 404 (如预期)。

索引.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;
  }
};
Run Code Online (Sandbox Code Playgroud)

无服务器.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+}"
Run Code Online (Sandbox Code Playgroud)

包.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"
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

我遇到了同样的问题,但添加下面的 onProxyRes 选项解决了它

  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();
    });
  }
Run Code Online (Sandbox Code Playgroud)