如何让我的参数从无服务器传递到我的快速路由器?

How do I get my parameters to pass from serverless to my express router?

我正在使用 express/nodejs 和无服务器

与 AWS Lambda 合作

但是serverless(serverless offline)是匹配我的URL的完整路径,可以处理参数。然后将其传递给我的处理程序,该处理程序使用 express 来解析路径。但是,Express 路由器不再接收完整路径 - 匹配的参数被丢弃。

我的 .yml 文件中有以下配置:

functions:
     api:
       handler: lambda.universal
       events:
         - httpApi:
            method: '*'
            path: /api
         - httpApi:
            method: '*'
            path: /api/{params}

这是处理程序:

export const universal = (event: APIGatewayProxyEvent, context: Context) =>
{
    awsServerlessExpress.proxy(server, event, context);
}

哪个到这个路由器(为了简洁我删除了一些东西):

 router.get("/:param", async (req: Request, res: Response) => {

 
      console.log("get with param hit");
      const response = getNode(); // defined elsewhere

      res.status(200).send(response);

  });


 router.get("/", async (req: Request, res: Response) => {

 
      console.log("get hit (no param)");
      const response = getNode(); // defined elsewhere

      res.status(200).send(response);

  });

当我 运行 调用 URL(即 localhost:3000/api/,或 localhost:3000/api/parameter-here)时,它仍然击中第二条路线并打印“被击中(无参数)”。我还查看了路由器接收的参数(req 和 res),它不包含完整路径。 req.path 始终只是 '/',req.paramas 始终是 {},req.route 包含内容但无用,req.url 只是 '/'。

有没有办法让无服务器接收的 {params} 传递到我的路由器的路由中?

谢谢!

所以,回答我自己的问题:

我的问题的字面答案是我需要在定义路由之前包含中间件:

// 3.x
const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware')
router.use(awsServerlessExpressMiddleware.eventContext())
router.get('/', (req, res) => {
  res.json({
    stage: req.apiGateway.event.requestContext.stage
  })
})

但是,更好的答案是更新到可以更好地处理此问题的 v4。我按照这两个 URL 中第一个的说明对其进行了升级(但包含 2 个 URL,以防其中一个失效!第二个也有更多信息。

https://github.com/vendia/serverless-express/blob/mainline/UPGRADE.md https://www.npmjs.com/package/@vendia/serverless-express