写在前面
今天我们来看看如何在node环境下在本机构建web服务器。
我们知道服务器与看客户端传递信息通过http协议,所以在看此文章之前需要对http有个简单的认识,http也可以参考我的另外一篇文章。
然后路由的理解路由是客户端地址与服务器程序代码的对应关系,简单来说就是请求什么响应什么。服务器端程序代码是请求地址的处理逻辑。 路由判断客户端请求的地址是什么,然后调用服务器端程序代码
创建人生第一个web服务器
- 1.导入http系统模块语句
const http = require('http');
- 2.创建web服务器语句
const app = http.createServer();
创建的对象app就是网站服务器。
- 3.当客户端发出request请求时,服务器做出响应
也就是说当有请求来的时候就去执行这个事件处理函数。参数req是请求,res是响应
app.on('request', (req, res) => {
//拥end方法结束请求并且为客户端返回这个结果
res.end('<h1>hi, user.this is the first webserver in my life</h1>');
});
- 4.监听端口(不可少)
// 监听3000端口
app.listen(3000);
console.log('服务器已启动,监听3000端口,请访问 localhost:3000')
前面文章中说过,hostname是找到计算机,端口号相当于门牌号找到对应的服务程序
创建web服务器结果
通过上面四步我们就在自己的计算机上创建了web服务器,当我们在终端输入nodemon myApp.js后终端就会打印服务器已启动。nodemon是node第三方模块,如果不认识就当做node命令。
然后地址栏输入网址lochost:3000就可以看到‘<h1>hi,user.this is the first webserver in my life<h1>’。
创建web服务器的完善
请求报文req.hader、请求方法req.method、请求地址req.url
1.获取请求方式(post/get)
通过req.method来判断请求方式
if (req.method == 'POST') {
res.end('post')
} else if (req.method == 'GET') {
res.end('get')
}
2.获取请求地址(初级)
通过req.url获取请求地址,例如我们输入http://localhost:3000/index那么url就是‘/index’。
//通过req.url获取请求地址
if(req.url == '/index' || req.url == '/') {
res.end('<h2>welcome to homePage</h2>');
}else if (req.url == '/list') {
res.end('welcome to listPage');
}else {
res.end('not find');
}
小tips:
当同时出现req.url和req.method的判断的时候,以最前面的为准,比如说下面的代码,pathname在method的前面,那么就以pathname为准。可能输出h2标签,不会输出post和get。
if (pathname == '/index' || pathname == '/') {
res.end('<h2>欢迎来到首页</h2>');
}else if (pathname == '/list') {
res.end('welcome to listpage');
}else {
res.end('not found');
}
if (req.method == 'POST') {
res.end('post')
} else if (req.method == 'GET') {
res.end('get')
}
3.获取请求报文
请求报文有两个,一个是在地址栏输入的请求,一个是字体图标发出的请求,字体图标请求是浏览器自动发生的。
- 一般在地址栏输入的请求都是get请求,发送post请求可以通过表单的方式。
<body>
<!--
method: 指定当前表单提交的方式
action: 指定当前表单提交的地址
-->
<form method="post" action="http://localhost:3000">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
</body>
默认情况下是get请求。
4.响应的状态码和文本类型
200是状态码表示一切ok,content-type指明返回文本类型是html,例如h2解析成二级标题。字符集是utf-8解决了中文乱码的问题。
res.writeHead(200, {
'content-type': 'text/html;charset=utf-8'
});
5.引入url系统模块处理url地址
当我们的url是http://localhost:3000/index?name=linglong&age=18的时候,需要将url路径各个部分解析出来。拿到请求参数 url.parse方法将url路径的各个部分解析出来并返回对象,true代表将参数解析为对象格式。
- 下面代码中的query和pathname是url对象中的属性。
console.log(req.url);
// 1) 要解析的url地址
// 2) 将查询参数解析成对象形式
let { query, pathname } = url.parse(req.url, true);
console.log(query.age;
console.log(query.name);


获取请求地址的改进
还记得前面的根据请求的url不同判断响应不同的东西吗if(req.url == '/index' || req.url == '/') {...}这个时候url是一个对象如果继续这样判断就会失效。
解决判断失效notfind的问题可以用url中pathname来判断,es6解构。前面的url是index(默认是\),将上面的代码改成以下格式。
if (pathname == '/index' || pathname == '/') {
res.end('<h2>welcome to homePage</h2>');
}else if (pathname == '/list') {
res.end('welcome to listpage');
}else {
res.end('not found');
}


最后的总结
- 创建服务器有四步,引入模块,create一个服务器,写好服务器处理函数,监听端口
- 默认的请求方法就是get,可以通过提交表单实现get请求。
- url的parse方法将url解析成对象的形式,es6对象解构拿到需要的属性。