Node学习入门篇(四):Node构建Web应用
内容
- Node API处理
- 构建RESTful Web服务
- 静态资源服务
- 表单处理
- HTTPS
Node API处理
- 底层封装
Node如何向开发者呈现HTTP请求;
如何编写一个简单的HTTP服务器,如何做响应;
如何读取请求头,以及如何设置响应头;
如何设置HTTP响应的状态码
- 生命周期
Node不会自动往客户端写任何响应。在调用完请求回调函数之后,就要由你负责用res.end()方法结束响应了(见图4-2)。这样在结束响应之前,你可以在请求的生命期内运行任何你想运行的异步逻辑。如果你没能结束响应,请求会挂起,直到客户端超时,或者它会一直处于打开状态
- 绑定端口
绑定一个端口,让服务器可以监听接入的请求。用到server.listen()方法,它能接受一个参数组合,指定一个能监听连接的端口。
- 读取请求头和设定响应头
构建RESTful Web服务
- RESTful
- POST
- 当Node的HTTP解析器读入并解析请求数据时,它会将数据做成data事件的形式,把解析好的数据块放入其中
- GET
- 为了提高响应速度,如果可能的话,应该在响应中带着Content-Length域一起发送
- 设定Content-Length域会隐含禁用Node的块编码,因为要传输的数据更少,所以能提升性能(字节长度,不是字符长度)
- DELETE
- Node提供了url模块,特别是.parse()函数
- 字符串转换为数字,可把字符串传给JavaScript的全局函数parseInt(),它会返回一个Number
- 状态码被设定成400,表示坏请求
- PUT
静态资源服务
- 静态文件(CSS、JavaScript、图片)服务
- 健壮而又高效的静态文件服务器
-
目的
- 创建一个简单的静态文件服务器;
- 用pipe()优化数据传输;
- 通过设定状态码处理用户和文件系统错误
-
实现
- 根目录:
__dirname
在Node中是一个神奇的变量,它的值是该文件所在目录的路径 - 服务器会将这个脚本所在的目录作为静态文件的根目录,但实际上你可以将根目录配置为任意的目录路径
- 攻击:如果你想把它放到生产环境中,应该更全面地检查输入的有效性,以防用户通过目录遍历攻击访问到你本来不想开放给他们的那部分内容
- 传输:高层流式硬盘访问fs.ReadStream完成,它是Node中Stream类之一
- 优化传输: Stream.pipe()
- 处理服务器错误
- 处理因使用fs.ReadStream可能出现的错误。如果你访问不存在的文件,或者不允许访问的文件,或者碰到任何与文件I/O有关的问题,当前的服务器会抛出错误
- 在Node中,所有继承了EventEmitter的类都可能会发出error事件
- fs.ReadStream这样的流只是专用的EventEmitter,有预先定义的data和end等事件
- 默认情况下,如果没有设置监听器,error事件会被抛出。如果你不监听这些错误,那它们就会搞垮你的服务器
- 为了防止服务器被错误搞垮,我们要监听错误,在fs.ReadStream上注册一个error事件处理器
- 处理服务器错误
- 根目录:
表单处理
- 接收表单数据
- 处理提交的表单域;
- 用formidable处理上传的文件;
- 实时计算上传进度
-处理提交的表单域 - application/x-www-form-urlencoded:这是HTML表单的默认值;
- multipart/form-data:在表单中含有文件或非ASCII或二进制数据时使用
- 文件上传
- formidable的流式解析器让它成为了处理文件上传的绝佳选择,也就是说它能随着数据块的上传接收它们,解析它们,并吐出特定的部分
- 不仅快,还不会因为需要大量缓冲而导致内存膨胀,即便像视频这种大型文件,也不会把进程压垮
- 集成formidable
- (1) 通过npm安装formidable;
- (2) 创建一个IncomingForm实例;
- (3) 调用form.parse()解析HTTP请求对象;
- (4) 监听表单事件field、file和end;
- (5) 使用formidable的高层API
- formidable会发出事件。比如说,在收到文件并处理好后会发出file事件,收完输入域后会发出field事件
- d 计算上传进度
- Formidable的progress事件能给出收到的字节数,以及期望收到的字节数
- 做出一个进度条
- 把这个进度传回到用户的浏览器中去
- Socket.IO这样的实时模块,可能只需要几行代码
HTTPS
- 安全的超文本传输协议(HTTPS)提供了一种保证Web会话私密性的方法
- HTTPS将HTTP和TLS/SSL传输层结合到一起。用HTTPS发送的数据是经过加密的,因此更难窃听
- 一个私钥和一份证书
- 钥本质上是个“秘钥”,可以用它来解密客户端发给服务器的数据。私钥保存在服务器上的一个文件里,放在一个不可信用户无法轻易访问到的地方
- 创建证书需要私钥。输入下面的命令会生成名为key-cert.pem的证书:
- 创建和配置
- 网站部署到公网上,你就应该找个证书颁发机构(CA)进行注册,并为你的服务器取得一份真实的、受信的证书