美文网首页
node构建一个简单的web服务器(http服务器)

node构建一个简单的web服务器(http服务器)

作者: 似朝朝我心 | 来源:发表于2020-11-03 23:46 被阅读0次

在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");

相关文章

网友评论

      本文标题:node构建一个简单的web服务器(http服务器)

      本文链接:https://www.haomeiwen.com/subject/gvuivktx.html