【问题标题】:AWS EB Route Problem When Passing Encoded Param传递编码参数时的 AWS EB 路由问题
【发布时间】:2019-10-09 14:39:53
【问题描述】:

我有一个通过 req.params app.get('/someroute/:val' => res.send(req.params.val)) 传递值的路由。这个值实际上是一个经过编码的 URL。

我通过 localhost 访问这条路线没有问题。但是,当我将其部署到 Elastic-Beanstalk 并尝试路由时,我收到 404 错误,指出找不到此路由。

我缺少一些配置吗?

app.get('/someroute/:url', (req, res) => {
  let uri = decodeURI(req.params.url);
  Promise.all([reqFileOne.getRequest(), reqFileTwo.getRequest(uri)])
    .then(d => res.json(d));
});

我希望能够到达路由,并像在我的本地机器上一样获得发送 json 响应。

在 AWS Elastic-Beanstalk 上,不幸的是我得到了 404。

【问题讨论】:

  • 所以我决定改为传递一个查询字符串,并且路由确实被命中了。我加回了 Promise 数组,它的功能正常。不幸的是,现在我得到了 504。除了新开发之外,我仍然很好奇为什么 req.params 不起作用?

标签: node.js amazon-web-services express amazon-elastic-beanstalk


【解决方案1】:

在 promise 之前添加一些调试以输出 uri 的值,以检查它是否符合您的预期。

建议您使用 decodeURIComponent 而不是 decodeURI,因为它被认为更可靠。在 Elastic Beanstalk 中,URI 解码可能会以未转义字符结束,从而提供格式错误的 URI,从而导致 404。

app.get('/someroute/:url', (req, res) => {
  let uri = decodeURIComponent(req.params.url);
  Promise.all([reqFileOne.getRequest(), reqFileTwo.getRequest(uri)])
.then(d => res.json(d));
});

如果您要进行编码,您也应该使用 encodeURIComponent 而不是 encodeURI。

【讨论】:

  • 仍然很困惑,我摆脱了承诺,决定只输入一个res.send('test'),但我仍然得到一个 404。我现在将 decodeURI 切换为 decodeURIComponent。
  • 其实我清空了整个箭头函数,只是加了一个res.send('test'),还是得到了404。AWS不喜欢req.params之类的吗?
  • @Edrich 冒着声明显而易见的风险,您正在解决错误的问题。如果清空函数仍然给你一个404,那么路由'/someroute/:url'根本不匹配传入的请求。你需要解决那个。对更简单的东西发出测试请求,例如/someroute/foo。这会执行函数并将url 设置为“foo”吗?如果不是,为什么不呢?问题不在于解码——你的代码永远达不到这一点。
  • @Michael-sqlbot - sqlbot 我了解,但我确实有其他路线会受到打击。为了确保,我重写了从'/someroute/:url''/someroute/foo' 的路线,这很有效。既然这被击中了,我们可以假设从路由传递参数有问题吗?
  • 我不是建议重新定义路由...我建议使用更简单的参数值测试现有路由——没有 url 转义字符,没有特殊/可能有问题的字符。
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2016-11-07
  • 2018-05-09
  • 2021-04-24
  • 2021-02-11
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多