4.1 HTTP服务器的基础知识
和php之类的语言或者其他框架比较,node的api比较底层,而且node的HTTP接口一样比较底层, 不过这是为了保证他的速度和灵活性。
4.1.1 node如何向开发者呈现HTTP请求
服务器收到一条http请求,都会都使用新的req和res对象请求回调函数。
在触发回调函数之前,node会解析请求的http头,并将它们作为req对象的一部分提供给请求回调。
调用完之后,node会一直等待res.end()方法,如果没有res.end()客户端会一直等待。
var http = require('http');
const server = http.createServer((req,res)=>{
//处理请求
});
server.listen(8000);
4.2 构建RESful web服务
创建标准的REST服务器需要实现四个HTTP谓词。
GET(获得)POST(改变/传输)PUT(侧重修改)DELETE(删除)
简述:
看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何
4.2.1 用post请求创建资源
使用req.setEncoding哦~
var server = http.createServer((req, res) => {
req.setEncoding('utf8');
//...接受post请求流程
});
4.2.1使用GET请求获得资源
使用content-length设置大小
var server = http.createServer((req, res) => {
res.setHeader('content-length',Buffer.byteLength());
});
4.2.3 用DELETE请求移除资源
使用url.parse分析url内容
console.log(url.parse('http://localhost:8000/1?api-key=foobar'));
4.3 提供静态文件服务
4.3.2 处理服务器错误
通过定制stream捕捉错报
var http = require('http');
var url = require('url');
var fs = require('fs');
var path = require('path');
var server = http.createServer((req, res) => {
const pathName = url.parse(req.url).pathname.slice(1);
console.log(pathName);
const filePath = path.resolve(__dirname, pathName);
res.setHeader('content-type', 'text/plain; charset="utf-8"');
var stream = fs.createReadStream(filePath);
stream.on('error',function(err){
res.statusCode = 500;
res.end('not found file');
})
stream.pipe(res);
});
server.listen(3000);
4.3.3 使用fs.stat()实现先发制人的错误处理
var http = require('http');
var url = require('url');
var fs = require('fs');
var path = require('path');
var server = http.createServer((req, res) => {
const pathName = url.parse(req.url).pathname.slice(1);
console.log(pathName);
const filePath = path.resolve(__dirname, pathName);
//使用stat
fs.stat(filePath, function (err, stat) {
//处理错误
console.log(stat);
if (err) {
//如果找不到返回404
if ('ENOENT' == err.code) {
res.statusCode = 404;
res.end('not found');
} else {
//其他错误返回500
res.statusCode = 500;
res.end('internal server error');
}
}
//设置length,通过pipe发送出去~
res.setHeader('content-length', stat.size);
var stream = fs.createReadStream(filePath);
stream.pipe(res);
//处理错报
stream.on('error', function (err) {
res.statusCode = 500;
res.end('internal server error');
})
})
});
server.listen(3000);
附:extname获得文件后缀
var extname = path.extname(fileName);