新手小白在node环境下创建web服务器

242 阅读4分钟

写在前面

今天我们来看看如何在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就可以看到‘&lth1>hi,user.this is the first webserver in my life&lth1&gt’。

创建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对象的结果。
第一行是console.log(req.headers['accept']);的结果,请求报文中的accept指的是请求报文接收html的格式,图片以及一些其他的格式。

获取请求地址的改进

还记得前面的根据请求的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');
	}

输入url地址看到结果如下。

最后的总结

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