首先需要引入http模块 var http = require('http')

创建服务

test.js
  • js
1
2
3
http.createServer(function(res,req){
// request 事件
})

或者是:

test.js
  • js
1
2
const server = http.createServer();
server.on('request',callback); //监听request事件

createserver的回调函数就是 server.on('request',callback);

listening 监听服务是否开启了

test.js
  • js
1
server.listening //返回一个 bool 值 表示服务器是否正在监听连接

request事件,回调函数的俩个参数重要的属性

test.js
  • js
1
server.on('request',function(req, res){...})

req

  • httpVersion
  • headers
  • url
  • method

res

  • res.write(chunk[,encoding])
    • 返回给前端的数据chunk 编码方式 默认utf8
  • res.writeHead(statusCode, [reasonPhrase状态码对应的文字信息], [headers])
    • 这个方法只能在当前请求中用一次,并且必须在response.end()之前调用
  • res.setHeader(name, value)
    • 设置返回头信息,单个的,自定义的
  • res.statusCode
    • 该属性用来设置返回的状态码
  • res.end([chunk][,encoding)
    • 当所有正文和头信息发送完成以后调用该方法,告诉服务器数据已经全部发送完了,
      这个方法在每次完成信息发送以后必须调用,并且是最后调用
test.js
  • js
1
server.on('error',function(err){...})

error事件用来监听连接出错的情况

test.js
  • js
1
server.listen()

listen事件,用来确定连接的端口号和主机名,必须有listen事件才能开始连接

test.js
  • js
1
server.listen(8080, 'localhost');

http处理get/post请求

  • request事件中回调函数可以通过req.url拿到这个url
  • 使用url.parse()方法解析url拿到url的对象urlStr
  • 根据urlStr.pathname来加载相应的页面
  • get请求的数据直接写在了urlquery
  • 直接使用querystirng模块来解析urlStr.query拿到数据
  • post请求数据写在了缓存区buffer
  • 在写入数据的过程中触发一个data事件
  • 数据写入完成的时候触发一个end事件
  • 数据在触发end事件的时候发送完成,转成字符串和get请求的数据格式一样
  • 使用querystirng.parse()解析得到数据的对象表示

示例代码

test.js
  • js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
var http = require('http');
var url = require('url');
var fs = require('fs');
var querystring = require('querystring');

const server = http.createServer();

const htmlDir = __dirname + '/html/';

server.on('request', function(req, res){
var urlStr = url.parse(req.url);
switch(urlStr.pathname) {
case '/':
sendData(htmlDir + 'index.html', req, res);
break;
case '/user':
sendData(htmlDir + 'user.html', req, res);
break;
case 'login':
sendData(htmlDir + 'login.html', req, res);
break;
case 'login/check':
if(req.method.toUpperCase() === 'POST'){//POST请求
var str = '';

req.on('data', function(chunk){
str += chunk;
});

req.on('end',function(){
//str里面写入了所有的通过POST请求的数据,形式如下
//userName=miaov&password=123463
const post_data = querystring.parse(str,"&");
//post_data里就是post请求的数据对象
});

}else{//GET请求
const get_data = queryString.parse(urlStr.query,'&');
//get_data就是get请求数据的对象
}
break;
default:
sendData(htmlDir + 'err.html', req, res);
break;
}
});

function sendData(fileName, req, res){
fs.readFile(fileName, function(err, data){
if(err){
res.writeHead(404,{
'content-type' : "text/html;charset=utf8"
});
res.write('页面找不到了');
res.end();
}else{
res.writeHead(200,{
'content-type' : 'text/html;charset=utf8'
});
res.write(data);
res.end();
}
}
}

server.on('error', function(err){
console.log(err);
});

server.listen(8080, 'localhost');