蛮害怕自己会忘记的,不妨做个简单的记录。
主要是参考Node 入门,适合有一定Javascript基础的人。
需求
做一个简单的服务器程序,实现以下功能:
get
方法:当打开/start
时,给用户返回一个表单。post
方法:用户点击提交表单时,能够获取提交的数据并且加载到/upload
界面。提交的内容包括文字和文件,文件以图片为例。
模块
为了以后便于维护(虽然现在比较简单,但为了以后着想),我们应该把服务器程序分成几个模块:
- server.js:生成一个服务器,解析url并把请求的路径给路由。
- router.js:路由程序,路由的功能是通过已给的路径执行相应的请求处理程序。
- requestHandler.js:定义所有的请求处理程序。
- index.js:主模块,负责把上述的所有模块连接起来。
顺便补充,该文件会用到一个解析表单的第三方模块formidable
,利用npm安装即可,注意要使用全局安装,而且第三方模块不能直接用require("formidable")
找到,需要用完整的路径或者把完整的第三方模块复制到当前项目下,以及将环境变量的NODE_PATH设置为C:\Program Files\nodejs(这只是举个例子,具体的用自己的nodejs路径)。
Coding
Hello, world
从server.js开始,先建立起一个没有任何功能的服务器吧,也就是对于任何请求都响应回一个Hello World
。创建一个服务器并不难,http
模块可以满足你的需求。
1 |
|
关于这段代码的解释:http.createServer()
方法用来创建一个http服务器,传入一个回调函数,回调函数的参数是request
和response
对象,前者存放了关于请求的一系列信息,后者是内部实现了可写流,可以往里填入响应的信息,整个方法返回一个http.Server
对象。
response.writeHead()
用来写响应首部字段,只能且必须调用一次,而且必须在request.end()
之前。它的第一个参数是状态码(200表示请求成功,404表示找不到请求资源),第二个参数是对象,是http的headers。
response.write()
用来写入响应主体,这里只是简单调用,可以参考Node.js官方文档查看更多信息。
reponse.end()
通知服务器响应头和响应主体发送完毕。
server.listen()
方法,用来监听端口。例子中监听本地的8080端口。
运行start()
后,浏览器中访问结果如下:
OK,服务器程序就这么诞生了!显然我们不希望在server.js中就调用它,只是把它作为一个接口暴露出去,让index.js调用才对,所以删掉这句start()
,我们在index.js中调用。index.js内容如下:
1 |
|
看上去很简单,毕竟这只是开始嘛,运行index.js结果和刚刚是一样的。
再来回忆下我们的需求,我们想要输入 http://localhost:8080/start 的时候出来一个表单,而在 http://localhost:8080/upload 显示结果,也就是不同的url有不同的结果!第一步是什么,第一步当然是解析url,来获取请求资源的路径,这需要用到url
模块了。我们来试试,还是server.js,添加这两行代码:
1 | // ... |
然后在浏览器中访问 http://localhost:8080/start ,再看看控制台的输出为:
1 | Server is running at http://localhost:8080/ ... |
request.url
返回当前所访问的url字符串,url.parse()
将字符串解析并返回一个对象,访问其中的pathname
属性获取路径。
第一次/start
显然是我们在浏览器输入的中想访问的路径,/favicon.ico
是大多数浏览器都会在访问的时候尝试读取的内容,不必在意。
既然获取了想要请求的路径,我们就可以通过路由程序和请求处理程序来决定响应的内容了。
未完待续…