个人学习笔记 - Node.js -http模块

78 阅读3分钟

http模块

在网络节点中,负责消费资源的电脑叫做 客户端;负责对外提供网络资源的电脑,叫做服务器
http模块是用来创建web服务器的模块,通过http模块提供的http.createServer()方法,就能把一台电脑变成一个web服务器,对外提供web资源
区别于普通电脑,一台web服务器,是具备了web服务器软件,例如:IIS、Apache等
服务器相关地址:

  • IP地址:
    • 每台计算机的唯一地址;格式为点分十进制(a。b。c。d),分别是0~255之间的十进制数整数;
    • 互联网中每台web服务器都有自己的ip地址
    • 开发过程中,自己的电脑为服务器客户端,127.0.0.1表示本机电脑
  • 域名和域名服务器:
    • 域名服务器(DNS)用来存放域名和IP的对应关系,将域名和IP进行转换的服务器
    • localhost === 127.0.0.1
  • 端口号:
    • 开启多个web服务的窗口,类似于门牌号
    • 客户端发来的请求通过端口号准确交给对应的web服务处理
    • 一个端口号只能占用一个web服务
    • 实际运用中URL中的80端口是可以省略
  • 创建Web服务器:
    1. 导入http模块
    2. 创建http服务器实例
    3. 为服务器实例绑定request事件,监听客户端的请求;Rxp.on('request', (req, res) => {});req为客户端相关的数据或属性
    4. 启动服务器;Rxp.listen(端口号, () => {})
    5. 客户端访问服务器相关数据或属性需要res.end()向客户端响应一些内容
//导入
const Http = require('http');
//创建实例
const server = Http.createServer();
//绑定request事件
server.on('request', (req, res) => {
    //req请求信息;res响应信息
    console.log('Someone is visiting web');
})
//启动服务器
server.listen(80, () => {
    console.log('Server is running on http://127.0.0.1');
})
  • 响应中文乱码:
    res.setHeader()设置响应报文内容类型
const Http = require('http');
const server = Http.createServer();
server.on('request', (req, res) => {
    const sRespond = '乱码';
    res.setHeader('Content-Type', 'text/html; charset=utf-8');
    res.end(sRespond)
})
server.listen(80, () => {
    console.log('on http://127.0.0.1');
})
  • 根据不同url响应不同的html内容:
    1. 获取请求的url地址
    2. 设置默认的响应内容为404 Not Found
    3. 判断用户请求的是否为/或/index.html 首页
    4. 判断用户请求的是否为/about.html 关于
    5. 设置Content-Type响应头,防止乱码
    6. res.end把内容响应给客户端
const Path = require('path');
const Http = require('http');

const server = Http.createServer();
server.on('request', (req, res) => {
    const { url: sUrl, method: sMethod } = req;
    const sSplitUrl = sMethod == 'POST' ? sUrl.split('/')[1] : sUrl.split('/')[1].split('?')[0];
    const sText = '404 Not Found';
    let havePage = true;
    let sJumpUrl = '/';
    switch (sSplitUrl) {
        case '':
        case 'index.html':
            sJumpUrl = Path.join(__dirname, './clock/index.html');
            break;
        case 'index.html':
            sJumpUrl = Path.join(__dirname, './clock/index.html');
            break;
        case 'about.html':
            havePage = false;
            break;
        default:
            havePage = false;
            break;
    }
        //特别注意此处获取的类型-text/html
    res.setHeader('Content-Type', 'text/html; charset=utf-8');
    res.end(havePage ? sJumpUrl : sText)
});
server.listen(80, () => {
    console.log('is on http://127.0.0.1');
})
  • 案例-跳转到对应服务器数据
const Path = require('path');
const Fs = require('fs');
const Http = require('http');

const server = Http.createServer();
server.on('request', (req, res) => {
    const { url: sUrl, method: sMethod = 'GET' } = req;
    let sFinalPath = sUrl === '/' ? '/index.html' : sUrl;
    const sLocalPath = Path.join(__dirname, '/clock',sFinalPath);
    const sText = '<h1>404 Not Found</h1>';
    Fs.readFile(sLocalPath, 'utf8', (err, data) => {
        if (err) return res.end(sText);
        /** S 设置响应头文件类型 */
        let sHeader = 'text/html; charset=utf-8';
        switch (Path.extname(sLocalPath)) {
            case '.js':
                sHeader = 'application/javascript; charset=utf-8';
                break;
            case '.css':
                sHeader = 'text/css';
                break;
            case '.html':
            default:
                break;
        }
        res.setHeader('Content-Type', sHeader);
        /** E 设置响应头文件类型 */
        res.end(data)
    })

});
server.listen(80, () => {
    console.log('is on http://127.0.0.1');
})