使用node构建一个web服务器

在node中提供了一个核心模块 http ,这个模块的是用来编写服务器的

这是最简单的http服务

//1、加载http模块
var http = require('http')

//2、使用http.createServer()方法创建一个web服务器,方法返回值是一个Server实例
var server = http.createServer()

//3、注册request事件,当客户端发起请求,自动触发request事件,然后执行回调函数
server.on('request', function() {
	console.log("收到了客户端的请求")
})

//4、绑定端口号,启动服务器
server.listen(3000, function() {
	console.log("服务器启动成功,可以通过localhsot:3000来进行访问")
})

在浏览器输入网址,会给出回应(要先打开apache服务)

node 服务端架构设计 node写服务端_客户端


给客户端发送响应数据

//回调函数包含两个参数:request和response
//request请求对象,可以用来获取客户端的一些请求信息,例如请求路径
//response相应对象,可以用来给客户端发送响应消息
//response有一个write函数,可以给客户端发送响应数据。write可以使用多次,但最后一定要使用end结束响应,否则客户端会一直等待
server.on('request', function(request, response) {
	console.log("收到了客户端的请求,请求路径是:", request.url)
	response.write('Hello World!')
	response.write('Hello Node.js!')
	response.end()
})

node 服务端架构设计 node写服务端_服务器_02


一般不推荐上面的那种写法,可以直接在end中返回相应内容

response.end('hello World')

根据不同请求路径发送不同的相应结果

//加载模块
var http = require('http')
//创建web服务器
var server = http.createServer()
//注册request事件
server.on('request', function(request, response) {
	var url = request.url
	response.setHeader('Content-Type', 'text/palin; charset=utf-8'); //解决中文乱码
	if (url === '/') {
		response.end('这里是首页')
	} else if (url === '/login') {
		response.end('这里是登录页面')
	} else {
		response.end('404 Not Found the page')
	}
})

//注册端口号
server.listen('3000', function() {
	console.log('服务器启动成功,可以通过localhost:3000进行访问')
})

node 服务端架构设计 node写服务端_node 服务端架构设计_03


注: response.url 是端口号后面的那一部分路径,也就是说url都是以/开头

中文乱码的原因:服务器默认发送的数据,采用utf8编码,但是浏览器不知道你是utf8编码,所以会按照当前操作系统的默认编码去解析

响应json数据
在请求接口时一般服务器都会返回一个json数据,但是服务器返回数据的内容只能说字符串或者二进制数

var info = [{
	name: '张三',
	age: 15,
	phoone: 15066666666
}]
if (url === '/login') {
	response.end(JSON.stringify(info))
}

可以使用JSON.stringify()将数组转换为json字符串

node 服务端架构设计 node写服务端_html_04


响应html

home.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1>这里是首页</h1>
		<p>这是服务器响应的html页面</p>
	</body>
</html>

服务器代码

//加载模块
var fs = require('fs')
var http = require('http')

//创建server实例
var server = http.createServer()

//注册request事件
server.on('request', function(request, response) {
	var url = request.url
	response.setHeader('Content-Type', 'text/html; charset=utf-8');
	if (url === '/') {
		fs.readFile('./home.html', function(err, data) {
			if (err) {
				response.end('访问失败,请稍后重试')
			} else {
				response.end(data)
			}
		})
	}
})

//绑定端口号
server.listen(3000, function() {
	console.log('服务器启动成功,可以通过localhost:3000进行访问')
})

node 服务端架构设计 node写服务端_服务器_05

响应图片

server.on('request', function(request, response) {
	var url = request.url
	response.setHeader('Content-Type', 'image/jpeg;');
	if (url === '/') {
		fs.readFile('./abc.jpg', function(err, data) {
			if (err) {
				response.end('访问失败,请稍后重试')
			} else {
				response.end(data)
			}
		})
	}
})

注:加载图片是就不需要指定编码,只需要指定格式即可

Content-type对照表

仿apache实现文件或页面的加载显示

准备:建一个www目录,将要显示的文件或页面,放到该目录下

实现代码

//加载模块
var http = require('http')
var fs = require('fs')

//创建服务
var server = http.createServer()

//www目录,方便www目录移动后的修改
var wwwDir = 'D:/MyWorkSpace/node/d2/www'

//监听响应
server.on('request', function(request, response) {
	var url = request.url;
	var filePath = '/index.html'
	if (url !== '/') {
		filePath = url
	}

	fs.readFile(wwwDir + filePath, function(err, data) {
		if (err) {
			return response.end('404 Not Find the page')
		} else {
			response.end(data)
		}
	})
})

//注册端口号
server.listen(5000, function() {
	console.log('Server is running .....')
})

注:文件路径分隔符必须是/,不能是\,否则会报错

基本流程的简写

//加载模块
var http = require('http')
var fs = require('fs')

//流程格式

http.createServer(function(request, response) {

}).listen(3000, function() {

})

服务端关于静态文件的处理

目录约定:关于一些静态资源同一放到public目录下

--public
------css           存放css样式文件
------js            存放一些JavaScript代码
------image         存放一些图片
------lib           存放第三方的资源文件
等

处理:当请求路径是public开头时,文件直接进行读取
home.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1>首页</h1>
		<img src="/public/image/abc.jpg" >
	</body>
</html>

服务器文件

var http = require('http')
var fs = require('fs')

http.createServer(function(request, response) {
	var url = request.url
	if (url === '/') {
		fs.readFile('./home.html', function(err, data) {
			if (err) {
				response.end('404')
		   console.log(err)
			} else {
				response.end(data)
			}
		})
	} else if (url.indexOf('/public/') === 0) {
		fs.readFile('.' + url, function(err, data) { //必须加点,不然会造成路径访问错误
			if (err) {
				response.end('404')
			} else {
				response.end(data)
			}
		})
	}
}).listen(5000, function() {
	console.log('server is running ....')
})

这样前端页面中使用到的资源可以直接从服务器里进行读取,不需要读取本地的文件

注意: 在服务器端中,文件中的路径就不要去写相对路径,因为这个时候所有的资源都是通过url标识来获取的,我的服务器开放了/public/目录,所有请求路径都要写出:/public/xxx