在node中专门提供了一个核心模块:http,http这个模块的职责就是用来帮助我们创建编写服务器的
1.加载 http 核心模块。
const http = require('http')
2.使用 http.createServer() 方法创建一个web服务器。
- 返回的是一个Server实例。
const server = http.createServer()
3.服务器自己要干嘛?或者说它要走什么样的一个流程?
具体操作如下:
- 提供对数据的服务。
- 发送请求。
- 接收请求。
- 处理请求。
- 给个反馈(发送响应机制)
- 注册 request 请求事件,当客户端发送请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数(即回调处理函数) 。
//监听request请求事件,设置请求处理函数。
server.on('request', () => {
console.log('收到客户端发送过来的请求了!')
})
4.绑定(监听)端口号(端口号必须得有,默认是80端口,端口号上限是65535),启动服务器,打印日志信息。
server.listen(8081, () => {
console.log('服务器启动成功,你可以通过 http://127.0.0.1:8081/ 来进行访问')
})
-
到这一步的话,服务器可以开启成功,但服务器不会有任何的响应,浏览器会处于等待状态,页面一直处于正在加载。
5.继续完善我们的服务器,回到request事件处理函数。
request 事件处理函数,需要接收2个参数:分别是request、response。
- request(即请求对象):请求对象可以用来获取客户端的一些请求信息,例如请求路径等。
server.on('request', (request, response) => {
console.log(`收到客户端发送过来的请求了!请求路径是${request.url}`)
})

- response(即响应对象):响应对象可以用来给客户端发送响应信息。
response对象有一个write()方法,可以用来给客户端发送响应数据信息,write()方法可使用多次。
但是最后一定一定要使用end()方法来结束响应(告诉客户端,我话说完了,你可以把数据呈现给用户界面了),否则客户端会一直处于等待状态。
server.on('request', (request, response) => {
console.log(`收到客户端发送过来的请求了!请求路径是${request.url}`)
response.write('hello! ')
response.write('the world is beautiful')
response.end()
})
上面的write()方法输入内容,我们一般很少用,我们还有更简单的方式,可以在直接end()的同时写入内容,实现的效果是一样的。
response.end('hello! the world is beautiful')
到这一步,我们不难发现我们当前的服务器的能力非常的弱,无论我们请求的是哪个路径,都只能响应hello! the world is beautiful内容。

所以我们要做的就是,我们希望请求不同的路径的时候,响应不同的结果。

方法如下:
- 获取请求路径
let url = request.url
request.url获取到的是端口号之后的那一部分路径,也就是说以 / 开头,默认这个/是隐藏起来的。这里的/代表的就是从根目录(当前路径)开始,通常网站的/对应的就是网站的首页。

- 判断路径,处理响应
server.on('request', (request, response) => {
let url = request.url
if (url === '/') {//如果请求到的是首页的路径,那就显示首页界面
response.end('this is Home page')
}else if (url === '/login') {//如果请求到的是用户登录的路径,那就显示用户登录界面
response.end('this is Login page!!!')
}else {//如果没有请求到对应路径,来个404反馈
response.end('--404 Not Found--')
}
})
来看下界面的效果。

完整代码如下:
const http = require('http')
const server = http.createServer();
server.on('request', (request, response) => {
let url = request.url
if (url === '/') {//如果请求到的是首页的路径,那就显示首页界面
response.end('this is Home page')
}else if (url === '/login') {//如果请求到的是用户登录的路径,那就显示用户登录界面
response.end('this is Login page!!!')
}else {//如果没有请求到对应路径,来个404反馈
response.end('--404 Not Found--')
}
})
server.listen(8081, () => {
console.log('服务器启动成功,你可以通过 http://127.0.0.1:8081/ 来进行访问')
})
学习到了这里,我们可以写一个简单版的API接口来练习,返回一个json格式的数组。
const http = require('http')
const server = http.createServer();
server.on('request', (request, response) => {
let url = request.url
if (url === '/goodsList') {//如果请求到的是商品列表的路径,那就显示商品界面数据
const goodsList = [
{
name: "iphone1",
price: 1999
},
{
name: "iphone2",
price: 2999
},
{
name: "iphone3",
price: 3999
},
{
name: "iphone4",
price: 4999
},
{
name: "iphone5",
price: 5999
},
{
name: "iphone6",
price: 6999
},
{
name: "iphone7",
price: 7999
},
{
name: "iphone8",
price: 8999
},
{
name: "iphone9",
price: 9999
},
{
name: "iphoneX",
price: 11999
}
]
response.end(JSON.stringify(goodsList))
} else if (url === '/user') {//如果请求到的是用户路径,那就显示用户界面的数据
//格式同上面
} else {//如果没有请求到对应路径,来个404反馈
response.end('404 Not Found')
}
})
server.listen(8081, () => {
console.log('服务器启动成功,你可以通过 http://127.0.0.1:8081 来进行访问')
})
关于下面这行代码的解释:

response.end(),响应内容只能是二进制数据或者字符串,不能是如下类型数据:
number类型、Object、Array、boolean类型。
如果我们想要响应数组类型,我们需要通过response.end(JSON.stringfy())方法进行转译。
来看下效果:

如果你使用了中文,会出现中文乱码的情况,需要额外设置请求头,需把这行代码添加进去:
response.setHeader("Content-Type","text/plain; charset=utf-8");
网友评论