【问题标题】:how to pass a url as a "url parameter" in express?如何在express中将url作为“url参数”传递?
【发布时间】:2017-08-17 21:23:29
【问题描述】:

在我的 express 应用中,我有一个监听 api/shorten/ 的路由器:

    router.get('api/shorten/:longUrl', function(req, res, next) {
        console.log(req.params.longUrl);
    }

当我使用类似的东西时:

http://localhost:3000/api/shorten/www.udemy.com

我得到了www.udemy.com,这是我所期望的。

但是当我使用时:

http://localhost:3000/api/shorten/http://www.udemy.com

我收到 404 错误。

我想在访问req.params.parameter时得到http://www.udemy.com

【问题讨论】:

  • 您必须将 url 作为正文或至少在查询参数中传递,而不是附加到原始 url 本身。你得到的错误是因为浏览器会过滤掉它
  • 您必须对您附加的 URL 进行编码,因为除了协议之外的任何地方都不允许使用像 : 这样的字符,因此不能在 URL 的路径中使用。
  • @binariedMe - 这不是真的。如果编码正确,它可以在路径中。
  • 同意。我个人不喜欢编码,因为您需要在服务器端重新创建 url。而是将其作为查询参数或在正文中传递很容易
  • 那些不是合法的 URI。 : 字符出现在除第一个协议之外的任何位置时都必须进行编码。请参阅第 2.2 节。 RFC.

标签: javascript node.js express routing url-parameters


【解决方案1】:

我只想补充一点,如果您将 ?param=some_param 之类的其他参数传递到您的“url 参数”中,它将不会显示在 req.params[0] 中。 相反,您可以使用 req.url 属性。

【讨论】:

  • 或者你可以查看完整的req.params数组!如果您正在寻找具有特定键的参数,您可以使用const paramKeys = Object.keys(req.params) 按它们出现的顺序获取键,然后使用const matchingIndex = paramKeys.findIndex('the-query-key-im-looking-for') 来查找参数的索引,最后使用req.params[matchingIndex 来获取价值。
【解决方案2】:

我不确定您是否仍在寻找解决此问题的方法。也许以防万一其他人试图弄清楚同样的事情,这是解决您问题的简单方法:

app.get('/new/*', function(req, res) {

  // Grab params that are attached on the end of the /new/ route
  var url = req.params[0];

这样您就不必担心任何正斜杠被误认为是路由或目录,它会抓取 /new/ 之后的所有内容。

【讨论】:

  • 谢谢@Allan。我已经找到了这个解决方案,但是您的回答将对面临同样问题的其他人有所帮助。我会接受它,因为这是我用来解决问题的答案。
【解决方案3】:

您需要在客户端使用encodeURIComponent,在快递服务器中使用decodeURIComponent,这将编码来自url参数的所有不允许的字符,如:/

【讨论】:

  • 我正在设计一个 API,所以我无法控制客户端。我无法在客户端对其进行编码,我只能在服务器中处理它
【解决方案4】:

你需要这样逃跑:

escape("http://www.google.com")

返回:

"http%3A//www.google.com"

【讨论】:

  • 感谢您的回复,但我想在不编码的情况下解决它,我想按原样传递它并在服务器端处理它。
  • 好吧,把你的路由改成“api/shorten/:longUrl*”
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2017-03-22
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多