node.js简单学习(二)http模块

130 阅读3分钟

说明

本文为node.js学习的第二部分,上一部分讲解了node.js中的文件读写模块fs,这部分为大家介绍它的http模块,并利用这个模块建立一个简单的服务器,希望大家能通过本文学习到以下知识点:

  1. 如何创建一个服务器
  2. 怎样根据不同的url地址匹配不同的网页

利用http模块创建一个服务器

利用node提供的http模块只需要很简单的几行代码就可以创建一个服务器

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
    console.log('服务器接收了请求')
})
server.listen(80, () => {
    console.log('服务运行在http://127.0.0.1')
})

首先我们引入http模块,调用createServer创建一个Server对象,调用server.on监听request请求,只要服务器被访问了就会打印出内容,调用server.listen让服务运行在本地的80端口,至此一个简单的node服务器就被启动了。

运行结果

首先启动服务器,控制台打印出服务运行的地址

image.png

在vsCode按ctrl+鼠标左键打开地址,或者复制地址到浏览器地址栏中打开,可以看见控制台打印了服务器接收了请求,表明我们的操作触发了server.on的监听。时网页一直为正在加载的状态,这是正常的,因为我们没有指示服务器在监听到请求时应该返回什么内容到网页。

image.png

下面我们修改一下代码,让服务器在接受到请求后返回一个内容给网页

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
    console.log('服务器接收了请求')
    // 不设置的话中文会因为字符集的原因乱码
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.end('欢迎!')
})
server.listen(80, () => {
    console.log('服务运行在http://127.0.0.1')
})

这里我们使用了res.end向发送请求的客户端返回了内容,注意如果我们不调用res.setHeader设置请求头的话,返回的中文会因为字符集的原因导致乱码。

运行结果

image.png

当我们访问了127.0.0.1时网页输出了欢迎!,同时控制台打印了两次服务器接收了请求,明明我们只访问了一次网页为什么发送了两次请求?接下来我会修改代码打印出req来告诉大家为什么控制台会打印两次。

我们修改一下代码,打印出req.url告诉我们请求的url地址

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
    console.log('服务器接收了请求,请求地址为' + req.url)
    // 不设置的话中文会因为字符集的原因乱码
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.end('欢迎!')
})
server.listen(80, () => {
    console.log('服务运行在http://127.0.0.1')
})

运行结果

image.png

可以看见两次的地址分别为127.0.0.1/127.0.0.1/favicon.ico,第一个地址是我们点击链接后发送请求的地址,而第二地址则是我们获取网页图标的一个操作,因此每当我们访问127.0.0.1时都会发送两次请求。

根据不同的url地址匹配不同的网页

上面我们介绍了如何利用http模块创建一个简单的服务器,下面我们结合上一篇fs模块的使用实现一个根据不同的请求地址返回不同网页的服务器。

const http = require('http')
const fs = require('fs')
const path = require('path')
const server = http.createServer()
server.on('request', (req, res) => {
    const { url } = req
    let filePath
    console.log('服务被访问' + req.url)
    if (url === '/index.html' || url === '/') {
        filePath = path.join(__dirname, 'index.html')
    } else if (url === '/about.html') {
        filePath = path.join(__dirname, 'about.html')
    } else {
        filePath = path.join(__dirname, '404.html')
    }
    fs.readFile(filePath, (err, data) => {
        if (err) {
            console.log('获取资源失败' + err)
        } else {
            res.end(data.toString())
        }
    })
})
server.listen(80, () => {
    console.log('服务运行在http://127.0.0.1')
})

我们知道req.url返回127.0.0.1后面的url地址,因此我们可以对不同的地址生成不同的文件路径并向客户端返回文件。

运行结果

1.默认路径

image.png

2.index.html

image.png

3.about.html

image.png

4.其他路径

image.png

至此我们就可以利用http模块实现一个简单的服务器功能。