当你不再满足于”Hello, world”。
路由router
上一篇最后说到了如何利用url.parse()
获得路径,接下来就是用所解析出来的pathname来找到相应的响应程序,也就是路由的功能。创建一个router.js,内容如下:
1 |
|
并对server.js和index.js内容进行相应的修改:
server.js:
1 |
|
index.js:
1 |
|
我们可以看到终端的结果仍旧是:
1 | Server is running at http://localhost:8080/ ... |
请求处理程序requestHandler
因为目前为止我们还没有开始定义相应的请求处理程序,router.js自然也不会有什么能做的事情,那么就再来定义请求处理程序吧,创建requestHandler.js:
1 |
|
我们把对response
的操作放到了这里来(在server.js中的对它操作的代码可以删掉了),这是为了非阻塞的处理请求响应,虽然这里没有体现出来,因为没有涉及到异步代码,具体的说明在Node 入门中可以看到,当然那个教程里的例子我想是基于Linux的吧,在Windows下执行不了,当然你可以改成setTimeout()
函数进行测试,因为setTimeout()
也是异步执行的。
好了,通过上面的代码我们已经有了初步的请求处理程序,虽然只是简单的打印了一下函数对应的名字,但一步一步来嘛,不要着急。接下来我们通过传递对象的方式来把这些方法通过index.js传递到router.js中去执行:
index.js:
1 |
|
server.js:
1 | // ... |
router.js:
1 |
|
router.js中我们检查pathname是否有对应的请求处理程序,没有则响应失败,返回404。运行如下:
Get
基本的框架大概已经搭建好了,那么现在就开始来填充细节吧,逐步完善我们想要的功能,首先是在请求/start
的时候返回一个表单页面,这里就弄一个简单的表单网页吧,把它保存到工程目录下你喜欢的位置命名为form.html:
1 | <html> |
如何把它加入到response中呢?接下来我们就要用到Node.js处理文件IO的模块fs
,对requestHandler.js的start()
方法进行如下修改:
1 | function start(request, response) { |
createReadStream()
方法用来创建一个可读流,读取form.html文件,pipe()
方式是类似于管道将可读流的内容传到可写流中,之前说过response
实现了可写流(注意不是继承),甚至注意到连response.end()
都不用调用了。OK我们马上来测试一下吧:
提交一下看看呢:
怎么什么都没有?因为还没有处理upload()
函数嘛,但其实上面那个过程我们已经知道该怎么处理get
方法了,其实非常简单,分析url并直接调用请求处理函数就好了,post
方法可能会稍微有点麻烦,下一篇具体说明该如何写post
。
未完待续…