- http作为服务端
Node.js模块化规范,common.js,引入模块用require,不可以用es6的import
server.js代码如下:
开启服务,server模块
const http = require('http');
//node中的服务都是继承eventemit
//开启服务的第一种写法,createServer方法
var server = http.creatServer(function(req, res){
//开启服务后需要做什么
res.end('hello word')
}).listen(8080)
//开启服务器的第二种写法,server对象监听
const server = new http.Server();
server.on('request', function(req, res){
//开启服务后需要做什么
//请求路径:req.url
var path = req.url
//设置响应头:
// 1. res.setHeader(); 可以调用多次,每次只能设置一个属性
res.setHeader('aaa', 'bbb');
res.setHeader('ccc', 'ddd')
//2. res.writeHead(); 全局只能调用一次,设置多次会被覆盖,可以设置多个属性。
res.writeHeader(200, {'content-type': 'text/plain;charset = utf-8', 'aaa' : 12344})
//第一个参数是状态码,第二个参数是告诉浏览器,这是一个text文件
switch(path){
case '/':res.end('home page');
break;
case '/second':res.end('second page');
break;
default:res.end('404');
break;
}
res.end('hello world!');
})
server.listen(8081)
设置setHeader会和writeHeader融合到一起。如果setHeader和writeHeader同时设置相同的属性,会以writeHeader为主。在network中看response headers,aaa的属性值是12344。writeHeader必须写在setHeader之后,否则会报错。如果要往客户端写入cookie,也可以通过设置响应头。
res.write(); //可以多次调用
res,end(); //只能调用一次
write和end必须接收一个字符串或者buffer(二进制编码)
buffer.tostring(); //可以将buffer转成字符串
获取请求头信息
req.httpVersion //http协议版本 1.0 1.1
req.method //请求方法
req.url //请求路径
req.headers //请求头
http.STATUS_CODES //状态码信息
//验证token
var token = md5(req.url+req.headers['time']+'hsifisafasifu ');
//前端token加密方法:md5加密,路径拼时间戳拼随机密匙
if(req.headers['token']===token){
res.end()
}else{
res.writeHead(401, {'content-type': 'text/html;charset = utf-8'});
res.end('请求不被允许');
}
服务端常用的监听事件:
connection事件:tcp连接已经建立好了(在http运行之前,要先建立tcp连接)
//在数据传过来之前做的事情,在request事件之前触发
server.on('connection', function(){
})
//错误处理
server.on('error', function(err){
console.log(err)
//err.code 错误码,错误原因
})
服务端超时处理
//2s之后,没有发送任何消息了,就进行超时处理
server.setTimeout(2000, function(){})
response事件
//之调用一次
res.on('finish', function(){
console.log('响应完成')
})
//响应超时处理
res.on('timeout', function(){
console.log('服务器繁忙')
})
res.setTimeout(3000) //设置超时的时间
request事件监听
当发送一个大的请求的时候,node是按流一点点接受过来的,不是一次性接受过来的,每次接受数据都会触发data事件
//一般用来接受post请求,get请求不会触发,data是请求体,get请求的数据在请求头
req.on('data', function(chunk){
console.log('接受数据')
})
req.on('end', function(){
console.log('数据接受完')
})
文件断点续传,用的是req,pause(); //暂停
req.consume(); //继续
服务端接受get和post请求
- get请求
const url = require('url');
server.on('request', function(req, res){
//获取请求参数
var params = url.parse(req.url, true).query;
})
- post请求
const url = require('url');
server.on('request', function(req, res){
//获取请求参数
var body = '';
req.on('data', function(chunk){
body+=chunk;
});
req.on('end', function(){
console.log(body)
})
})
运行node,在目录打开命令行窗口,执行 node server.js
3. http作为客户端
client.js
发送请求
const http = require('http');
const option= {
hostname:'127.0.0.1', //请求的地址
port:3000, //请求端口
path: '/second', //请求路径
method: 'POST', //请求方法
headers:{
'Content-Type' : 'application/json'
} //请求头
}
//第一个参数是 接受配置,第二个参数是接受回调函数
var req = http.request(option, function(res){
var body = '';
res.on('data', function(chunk){
body+=chunk
})
res.on('end', function(chunk){
console.log(body)
})
});
var postjson = '{"a":123, "b":345}';
req.write(postjson);
req.end();
http.get('http://localhose:3000/?a=123', function(res){
var body = '';
res.on('data', function(chunk){
body+=chunk
})
res.on('end', function(chunk){
console.log(body)
})
});
响应头和请求头的设置
- req设置
const http = require('http');
const option= {
hostname:'127.0.0.1', //请求的地址
port:3000, //请求端口
path: '/second', //请求路径
method: 'POST', //请求方法
headers:{
'Content-Type' : 'application/json'
} //请求头
}
//第一个参数是 接受配置,第二个参数是接受回调函数
var req = http.request(option, function(res){
var body = '';
//防止接收的是乱码
res.setEncoding('utf-8');
res.headers; //服务器发送的响应头
res.statusCode; //服务器发送的状态码
res.on('data', function(chunk){
body+=chunk
})
res.on('end', function(chunk){
console.log(body)
})
});
var postjson = '{"a":123, "b":345}';
//设置请求头
req.setHeader('xxx', 123);
req.write(postjson);
req.end();
//错误处理
req.on(error, function(err){
console.log(err)
})
超时处理
req.setTimeout(3000, function(){
console.log('请求超时')
})
开启https
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('./privatekey.pem'), //私钥
cert: fs.readFieSyne('./certificate.pem') //公钥
};
https.createServer(options, (req, res)=>{
res.end()
}).listen(8080)
开启http和https的区别:开启https的配置需要一个读取私钥和公钥的属性
开启http2
const http2 = require('http2');
const fs = require('fs');
const options = {
key: fs.readFileSync('./privatekey.pem'), //私钥
cert: fs.readFieSyne('./certificate.pem') //公钥
};
https.createSecureServer(options, (req, res)=>{
res.end()
}).listen(8080)
真正会node还要掌握什么?
node使用数据库,Redis
node框架的使用
express,koa,egg
node服务器的部署
Linux服务器
node项目开发实战