我在rails中使用了params哈希,目前正在学习节点/表达式。我总是可以让params散列工作,但从来没有真正理解它到底是怎么回事。这是来自params的express.js文档的引文。
‘这个属性是一个数组,包含映射到命名路由“参数”的属性。例如,如果您有路由/用户/:名称,那么"name“属性可以作为req.params.name使用。此对象默认为{}。
我不知道这是怎么回事。所以
req.params.name
那么,在请求时,我们从对象参数中获取属性'name‘吗?但是,params也是一种路由,所以我们也从一条路由获得了一个属性?我知道:name将被params.name输出替换,但是它实际上是如何做到的呢?
任何帮助都将不胜感激,谢谢!
发布于 2014-01-28 11:26:43
这听起来似乎不是您的混淆,但为了确保,让我们明确req.params
与请求体或查询字符串无关(这些请求体和查询字符串存储在req.body
和req.query
respectively...assuming中,您有正确的中间件链接到其中来解析请求正文)。
传递给app.VERB
的第一个参数(其中VERB
通常是get
,post
中的一个,但可以是任何HTTP谓词aka方法)可以是以下任意一个:
|
连接,然后作为(1)处理。如果使用常规字符串,则可以访问类似正则表达式的语法。下面是一些您可以使用的有效路径和结果:
/foo/:bar
:将与/foo/abc
、/foo/123
等相匹配。req.params.bar
将分别为abc
或123
。/foo/:bar?
:将与/foo
或/foo/abc
等相匹配。req.params.bar
将分别为undefined
或abc
。/foo/:bar*
:将与/foo
、/foo/abc
、/foo/abc/xyz
等相匹配。req.params.bar
将是undefined
、abc
和abc
。你是怎么得到xyz
的?它在req.params
数组中,但提取起来并不特别方便。/foo/:bar(\d+)
:将与/foo/123
相匹配,但不会与/foo/abc
匹配。在匹配的情况下,req.params.bar
为123
。当然,所有这些东西结合在头脑麻木的方式(海事组织)递减的用处。
需要注意的一点是,在正则表达式中通常有意义的字符(如句点)在路由字符串中没有意义。例如,路径/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
您将看到,如果路由匹配,则从pathRegexp
在utils.js
中生成的正则表达式填充params。
发布于 2014-01-28 07:21:25
这是正确的,就像这样:
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中间件来完成。
https://stackoverflow.com/questions/21409087
复制相似问题