首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Params对象功能

Params对象功能
EN

Stack Overflow用户
提问于 2014-01-28 07:00:12
回答 2查看 70关注 0票数 0

我在rails中使用了params哈希,目前正在学习节点/表达式。我总是可以让params散列工作,但从来没有真正理解它到底是怎么回事。这是来自params的express.js文档的引文。

‘这个属性是一个数组,包含映射到命名路由“参数”的属性。例如,如果您有路由/用户/:名称,那么"name“属性可以作为req.params.name使用。此对象默认为{}。

我不知道这是怎么回事。所以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
req.params.name

那么,在请求时,我们从对象参数中获取属性'name‘吗?但是,params也是一种路由,所以我们也从一条路由获得了一个属性?我知道:name将被params.name输出替换,但是它实际上是如何做到的呢?

任何帮助都将不胜感激,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-28 11:26:43

这听起来似乎不是您的混淆,但为了确保,让我们明确req.params与请求体或查询字符串无关(这些请求体和查询字符串存储在req.bodyreq.query respectively...assuming中,您有正确的中间件链接到其中来解析请求正文)。

传递给app.VERB的第一个参数(其中VERB通常是getpost中的一个,但可以是任何HTTP谓词aka方法)可以是以下任意一个:

  1. String:字符串将被视为一种伪正则表达式,该表达式将被转换为一个真正的正则表达式(稍后将详细介绍)。
  2. RegExp:正则表达式不以任何方式解释。
  3. 数组:数组的元素将转换为字符串并与|连接,然后作为(1)处理。

如果使用常规字符串,则可以访问类似正则表达式的语法。下面是一些您可以使用的有效路径和结果:

  1. /foo/:bar:将与/foo/abc/foo/123等相匹配。req.params.bar将分别为abc123
  2. /foo/:bar?:将与/foo/foo/abc等相匹配。req.params.bar将分别为undefinedabc
  3. /foo/:bar*:将与/foo/foo/abc/foo/abc/xyz等相匹配。req.params.bar将是undefinedabcabc。你是怎么得到xyz的?它在req.params数组中,但提取起来并不特别方便。
  4. /foo/:bar(\d+):将与/foo/123相匹配,但不会与/foo/abc匹配。在匹配的情况下,req.params.bar123

当然,所有这些东西结合在头脑麻木的方式(海事组织)递减的用处。

需要注意的一点是,在正则表达式中通常有意义的字符(如句点)在路由字符串中没有意义。例如,路径/download/:name.:ext将匹配/download/foo.jpg,而不匹配/download/fooxjpg

如果您想了解所有这些“魔法”是如何发生的,您必须查看Express源代码。堆的最底部是函数pathRegexp,它采用您的路径,计算出它是字符串、regex还是数组,并将其转换为真正的regex。您可以在这里找到该函数:

https://github.com/visionmedia/express/blob/master/lib/utils.js

艰难地完成正则表达式的生成需要一些奉献精神,但对于那些非常了解正则表达式的人来说,这是可以做到的。然后,一旦您访问了该函数,就可以查看Route.prototype.match方法,在这里可以找到该方法:

https://github.com/visionmedia/express/blob/master/lib/router/route.js

您将看到,如果路由匹配,则从pathRegexputils.js中生成的正则表达式填充params。

票数 1
EN

Stack Overflow用户

发布于 2014-01-28 07:21:25

这是正确的,就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.get('/quote/:name', function(req, res) {
   req.params.name 
 }

但是,如果要获取查询字符串参数,则必须使用:(req.query)检查查询字符串params,ex:?name=Alex检查urlencoded params。

( req.body ),ex: name=alex为了利用用户编码的请求体,req.body应该是一个对象。这可以通过使用_express.bodyParser中间件来完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21409087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文