我在rails中使用了params hash,目前正在学习node / express。我总是能让params hash工作,但从来没有真正理解它究竟发生了什么。这是关于params的报价frome express.js文档。
'此属性是一个包含映射到命名路由“parameters”的属性的数组。例如,如果您有route / user /:name,那么“name”属性可用作req.params.name。此对象默认为{}。'
我不确定发生了什么。所以
req.params.name
所以在请求中我们从对象参数中获取属性'name'?但是,params也是一条路线,所以我们也从一条路线获得房产?我明白:name将被params.name输出替换,但它实际上是如何做到的?
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
听起来这不是你的困惑,但为了确保,让我们清楚req.params
与请求正文或查询字符串无关(那些存储在req.body
和{分别为{1}} ...假设你已经链接了适当的中间件来解析请求体。)
传递给req.query
的第一个参数(其中app.VERB
通常是VERB
之一,get
,但可以是任何HTTP动词aka方法)可以是任何一个以下内容:
字符串:字符串将被视为一种伪正则表达式,将被转换为真正的正则表达式(稍后将详细介绍)。
RegExp:不以任何方式解释正则表达式。
数组:数组的元素将转换为字符串并与post
连接,然后视为(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
,{{1 }和undefined
。你如何得到abc
?它位于abc
数组中,但提取起来并不是特别方便。
xyz
:匹配req.params
但不匹配/foo/:bar(\d+)
。如果是匹配,/foo/123
将为/foo/abc
。
当然,所有这些事情都会以令人麻木的方式(IMO)减少有用性。
需要注意的一点是,正则表达式中通常有意义的字符(如句点)在路径字符串中没有意义。例如,路径req.params.bar
将匹配123
但不匹配/download/:name.:ext
。
如果你想了解所有这些“神奇”的发生,你将不得不看一下Express源代码。在堆的最底部是函数/download/foo.jpg
,它将获取您的路径,确定它是字符串,正则表达式还是数组,并将其转换为真正的正则表达式。你可以在这里找到这个功能:
https://github.com/visionmedia/express/blob/master/lib/utils.js
通过正则表达式生成需要一些奉献精神,但是对于能够很好地理解正则表达式的人来说,这是非常有用的。然后,一旦你理解了这个功能,你可以看看/download/fooxjpg
方法,可以在这里找到:
https://github.com/visionmedia/express/blob/master/lib/router/route.js
如果路线匹配,您会看到params是由pathRegexp
中Route.prototype.match
生成的正则表达式填充的。
答案 1 :(得分:0)
这是正确的,像这样:
app.get('/quote/:name', function(req, res) {
req.params.name
}
但是如果你想获得查询字符串参数,那么你必须使用: (req.query)检查查询字符串参数,例如:?name = Alex检查urlencoded body params
(req.body),例如:name = alex要使用urlencoded请求主体,req.body应该是一个对象。这可以通过使用_express.bodyParser中间件来完成。