如何让我的参数从无服务器传递到我的快速路由器?
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
我正在使用 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