我们需要向路由提供请求的URL和其他需要的GET和POST参数,然后路由需要根据这些数据执行相应的代码。因此,我们需要查看HTTP请求并从中提取请求的URL和GET/POST参数。这个功能究竟应该属于路由还是服务器(甚至作为一个模块本身的功能)确实值得讨论,但这里暂定为我们HTTP服务器的功能。我们需要的所有数据都将包含在请求对象中,该对象作为onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的Node.JS模块,分别是url和querystring模块。url.parse(string).查询|url.parse(字符串).路径名|||||------------------------http://localhost:8888/start?foo=bar&hello=world--------||||querystring.parse(queryString)[“foo”]||querystring.parse(queryString)["hello"]当然我们也可以使用querystring模块来解析POST请求体中的参数,后面会演示。现在让我们在onRequest()函数中添加一些逻辑来找出浏览器请求的URL路径:server.js文件代码:varhttp=require("http");varurl=require("url");functionstart(){functiononRequest(request,response){varpathname=url.parse(request.url).pathname;console.log("请求"+路径名+"收到。");response.writeHead(200,{"Content-Type":"text/plain"});response.write("你好世界");响应结束();}http.createServer(onRequest).listen(8888);console.log("服务器已经启动。");}exports.start=start;好吧,我们的应用程序现在可以通过请求的URL路径来区分不同的请求——这允许我们使用路由(尚未完成)将请求发送到URL路径映射到基础的处理程序。在我们正在构建的应用程序中,这意味着来自/start和/upload的请求可以用不同的代码处理。稍后我们将看到这一切如何组合在一起。现在我们可以写路由了,创建一个名为router.js的文件,添加如下内容:router.js文件代码:}exports.route=路线;如您所见,这段代码什么都不做,但现在它应该做。在添加更多逻辑之前,让我们先看看如何将路由和服务器集成在一起。我们的服务器应该知道路由的存在并有效地使用它们。我们当然可以通过硬编码的方式将这个依赖绑定到服务端,但是其他语言的编程经验告诉我们,这将是一件很痛苦的事情,所以我们会使用依赖注入的方式来松散地添加路由模块。首先,让我们扩展服务器的start()函数,将路由函数作为参数传递。server.js文件的代码如下:varhttp=require("http");varurl=require("url");functionstart(route){functiononRequest(request,response){varpathname=url.parse(request.url).pathname;console.log("请求"+路径名+"收到。");路线(路径名);response.writeHead(200,{"Content-Type":"text/plain"});response.write("你好世界");响应结束();}http.createServer(onRequest).listen(8888);console.log("服务器已经启动。");}exports.start=start;
