Node.js - http 模块

528 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

创建 web 服务器的基本步骤

导入 http 模块

const http = require('http')

创建 web 服务器实例

const server = http.createServer()

为服务器实例绑定 request 事件,监听客户端请求

为服务器实例绑定 request 事件,即可监听客户端发过来的网络请求

//为服务器实例绑定 request 事件,监听客户端的请求
server.on('request',(req, res) => {
    //只要有客户端来请求我们自己的服务器,就会触发 request 事件,从而调用这个事件处理函数
    console.log('有人访问我们的网络服务器')
})

启动服务器

调用服务器实例 .listen() 方法,即可启动当前的 web 服务器实例

//调用 server.listen(端口号, callback 回调)方法,即可启动 web 服务器
server.listen(80, function(){
    console.log('HTTP服务器运行在http://127.0.0.1.80')
})

示例

const http = require('http')
const server = http.createServer()
server.on('request',(req, res) => {
    console.log('有人访问网络服务器')
})
server.listen(80, function(){
    console.log('HTTP服务器运行在http://127.0.0.1.80')
})

log:
[Running] node "/Users/user/Desktop/WS/node/nodeserver.js"

HTTP服务器运行在http://127.0.0.1:80

有人访问网络服务器(每次请求每次打印此log)
有人访问网络服务器
有人访问网络服务器


req 请求对象

  • 只有服务器接收到客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理函数
  • 如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下方式
const http = require('http')
const server = http.createServer()

server.on('request',(req, res) => {

    //req 是请求对象,它包含了与客户端相关的数据和属性如 客户端地址及请求类型等等
    
    const url = req.url
    const method = req.method
    const str = `请求链接是 ${url},你的请求方法是 ${method}`
    console.log(str)
})

server.listen(80, function(){
    console.log('HTTP服务器运行在 http://127.0.0.1.80')
})


log:

HTTP服务器运行在 http://127.0.0.1.80

请求链接是 /,你的请求方法是 GET(每次请求每次打印此log)
请求链接是 /,你的请求方法是 GET
请求链接是 /,你的请求方法是 GET

res 响应对象

  • 在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性可以使用如下方式

  • 通过调用 res.end() 方法,向客户端发送指定的内容,并结束这次请求的处理过程

    const http = require('http')
    const server = http.createServer()
    
    server.on ('request',(req,res) =>{
    
        //res 是响应对象,它包含了与服务器相关的数据和属性
        const url = req.url
        const method = req.method
        const str = `请求链接是 ${url},你的请求方法是 ${method}`
        
        // 向客户端发送指定的内容
        res.end(str)
    })
    
    server.listen(80, function(){
        console.log('HTTP服务器运行在 http://127.0.0.1.80')
    })
    

    log:(通过浏览器访问)

    Snip20220323_22.png

  • 解决中文乱码问题

    • 当调用 res.end() 方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式

    • 调用 res.setHeader() 方法,设置 Content-Type 响应头,解决中文乱码的问题

    const http = require('http')
    const server = http.createServer()
    
    server.on ('request',(req,res) =>{
        const url = req.url
        const method = req.method
        const str = `请求链接是 ${url},你的请求方法是 ${method}`
        
        //设置 Content-Type 响应头
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        
        res.end(str)
    })
    server.listen(80, function(){
        console.log('HTTP服务器运行在 http://127.0.0.1.80')
    })
    

    log:(通过浏览器访问)

    Snip20220323_23.png


根据不同的 url 响应不同的 html 内容

  • 核心步骤

    • 获取请求的 url 地址
    • 设置默认的响应内容为 404 Not found
    • 判断用户请求的是否为 / 或 /index.html 首页
    • 判断用户请求的是否为 /about.html 关于页面
    • 设置 Content-Type 响应头,防止中文乱码
    • 使用 res.end() 把内容响应给客户端
  • 示例

    const http = require('http')
    const server = http.createServer()
    
    server.on('request',(req, res) =>{
        //1.获取请求的 url 地址
        const url = req.url
        
        //2.设置默认的响应内容为 404 Not found
        let content = '<h1>404 Not found </h1>'
        
        //判断用户请求的是否为 / 或 /index.html 首页
        //判断用户请求的是否为 /about.html 关于页面
        if (url === '/' || url === '/index.html'){
            content = '<h1> 首页 </h1>'
        }else if (url === '/about.html'){
            content = '<h1> 关于 </h1>'
        }
        
        //设置 `Content-Type` 响应头,防止中文乱码
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        
        //使用 `res.end()` 把内容响应给客户端
        res.end(content)
    })
    
    server.listen(80, () => {
        console.log('HTTP服务器运行在http://127.0.0.1.80')
    })
    
  • 不同的链接对应的log:

    Snip20220323_24.png

    Snip20220323_25.png

    Snip20220323_24.png

    Snip20220323_27.png