Params对象功能

时间:2014-01-28 15:00:13

标签: javascript node.js express

我在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输出替换,但它实际上是如何做到的?

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

听起来这不是你的困惑,但为了确保,让我们清楚req.params与请求正文或查询字符串无关(那些存储在req.body和{分别为{1}} ...假设你已经链接了适当的中间件来解析请求体。)

传递给req.query的第一个参数(其中app.VERB通常是VERB之一,get,但可以是任何HTTP动词aka方法)可以是任何一个以下内容:

  1. 字符串:字符串将被视为一种伪正则表达式,将被转换为真正的正则表达式(稍后将详细介绍)。

  2. RegExp:不以任何方式解释正则表达式。

  3. 数组:数组的元素将转换为字符串并与post连接,然后视为(1)。

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

    1. |:匹配/foo/:bar/foo/abc等,/foo/123将分别为req.params.barabc

    2. 123:匹配/foo/:bar?/foo等,/foo/abc将分别为req.params.barundefined

    3. abc:将匹配/foo/:bar*/foo/foo/abc等。/foo/abc/xyz将为req.params.bar,{{1 }和undefined。你如何得到abc?它位于abc数组中,但提取起来并不是特别方便。

    4. xyz:匹配req.params但不匹配/foo/:bar(\d+)。如果是匹配,/foo/123将为/foo/abc

    5. 当然,所有这些事情都会以令人麻木的方式(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是由pathRegexpRoute.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中间件来完成。