nodejs之请求路由概述
通常来说对于不同的URL请求,服务器应该有不同的反应。我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。我们需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。为了解析这些数据,需要调用额外的模块,分别是url和querystring模块。
URL:This
modulehasutilitiesforURLresolutionandparsing.Callrequire('url')to
useit.
ParsedURLobjectshavesomeorallofthefollowingfields,dependingonwhetherornottheyexistintheURLstring.AnypartsthatarenotintheURLstringwillnotbeintheparsedobject.ExamplesareshownfortheURL
'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'
href:ThefullURLthatwasoriginallyparsed.Boththeprotocolandhostarelowercased.
Example:'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'
protocol:Therequestprotocol,lowercased.
Example:'http:'
host:ThefulllowercasedhostportionoftheURL,includingportinformation.
Example:'host.com:8080'
auth:TheauthenticationinformationportionofaURL.
Example:'user:pass'
hostname:Justthelowercasedhostnameportionofthehost.
Example:'host.com'
port:Theportnumberportionofthehost.
Example:'8080'
pathname:ThepathsectionoftheURL,thatcomesafterthehostandbeforethequery,includingtheinitialslashifpresent.
Example:'/p/a/t/h'
search:The'querystring'portionoftheURL,includingtheleadingquestionmark.
Example:'?query=string'
path:Concatenationofpathnameandsearch.
Example:'/p/a/t/h?query=string'
query:Eitherthe'params'portionofthequerystring,oraquerystring-parsedobject.
Example:'query=string'or{'query':'string'}
hash:The'fragment'portionoftheURLincludingthepound-sign.
Example:'#hash'
我们将使用依赖注入的方式较松散地添加路由模块。作为路由目标的函数称为请求处理程序,请求处理函数的实现需要创建一个叫做requestHandlers的模块,当然也可以命名为其他。并对于每一个请求处理程序,添加一个占位用函数,随后将这些函数作为模块的方法导出,这样就可以将请求处理程序和路由模块连接起来,让路由有路可循。
特别指出的是,这里需要将一系列请求处理程序通过一个对象来传递,并且需要使用松耦合的方式将这个对象注入到route()函数中。
我们可以用从关联数组中获取元素一样的方式从传递的对象中获取请求处理函数,因此就有了简洁流畅的形如handle[pathname]();的表达式。代码如下所示:
varhandle={} handle["/"]=requestHandlers.start; handle["/start"]=requestHandlers.start; handle["/upload"]=requestHandlers.upload;