• Node.js及其http模块简介


    环境

    • Ubuntu 22.04
    • Node.js 16.15.1
    • VSCode 1.69.2

    背景

    Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。

    我们知道,在浏览器中可以运行JavaScript脚本,这是因为浏览器包含了JavaScript的解析引擎,其中 V8 就是Chrome浏览器的JS解析引擎。那么,如果有独立的、非浏览器内嵌的JS解析引擎,则JavaScript代码不就可以独立运行,不受限于浏览器了吗?Node.js正是基于这一点应运而生,其本质仍然是JavaScript,只不过它基于V8引擎,提供了JavaScript所需的运行环境。

    • 浏览器中的JavaScript,可以使用浏览器内置的API(比如DOM、BOM等),也可以使用三方的库(比如jQuery、art-template等)。
    • Node.js可以使用内置的API(fs、http),也可以使用三方的库(比如express)。

    安装Node

    下载地址:https://nodejs.org/en/

    我下载的文件是 node-v16.15.1-linux-x64.tar.xz 。把文件解压,生成 node-v16.15.1-linux-x64 目录,把其下的 bin 目录加到 PATH 里。我是用的 zsh ,所以修改 ~/.zshrc 配置文件,添加:

    export PATH="/home/ding/Downloads/node-v16.15.1-linux-x64/bin:$PATH"
    
    • 1

    现在,就可以使用node命令了,比如:

    ➜  ~ node -v
    v16.15.1
    
    • 1
    • 2

    HelloWorld程序

    创建文件 0727_1.js

    console.log('hello world');
    
    • 1

    运行程序:

    ➜  temp0727 node 0727_1.js 
    hello world
    
    • 1
    • 2

    HTTP服务器

    创建文件 0727_2.js

    const http = require('http');
    
    const server = http.createServer();
    
    server.on('request', (req, res) => {
        console.log('hello');
        res.end('OK\n');
    });
    
    server.listen(8080, () => {
        console.log('server started');
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行程序,启动服务器:

    ➜  temp0727 node 0727_2.js            
    server started
    
    • 1
    • 2

    打开另一个命令行,访问服务器:

    ➜  ~ curl http://localhost:8080
    OK
    
    • 1
    • 2

    可见,得到了期望的“OK”响应。同时服务器的console也输出了“hello”:

    ➜  temp0727 node 0727_2.js            
    server started
    hello
    
    • 1
    • 2
    • 3

    按Ctrl + C停止服务器。

    中文乱码问题

    创建文件 0727_3.js

    const http = require('http');
    
    const server = http.createServer();
    
    server.on('request', (req, res) => {
        console.log('hello');
        res.end('hi, 你好\n');
    });
    
    server.listen(8080, () => {
        console.log('server started');
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在命令行下,用 curl 命令可以正确的显式:

    ➜  ~ curl http://localhost:8080
    hi, 你好
    
    • 1
    • 2

    但是在浏览器中会显示为乱码:

    在这里插入图片描述

    解决办法是添加如下代码:

        ......
        res.setHeader('Content-Type', 'text/html; charset=utf-8');
        ......
    
    • 1
    • 2
    • 3

    重新启动服务,现在浏览器中显示也OK了:

    在这里插入图片描述

    响应不同的请求

    可使用请求的 url 属性来区分不同的请求。

    创建文件 0727_4.js

    const http = require('http');
    
    const server = http.createServer();
    
    server.on('request', (req, res) => {
        console.log('hello');
    
        const url = req.url;
    
        var content = '';
    
        if (url === '/a.html') {
            content = '床前明月光\n';
        } else if (url === '/b.html') {
            content = '白日依山尽\n';
        }
    
        res.setHeader('Content-Type', 'text/html; charset=utf-8');
        res.end(content);
    });
    
    server.listen(8080, () => {
        console.log('server started');
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    运行程序,访问服务器,如下:

    ➜  ~ curl http://localhost:8080/a.html
    床前明月光
    ➜  ~ curl http://localhost:8080/b.html
    白日依山尽
    
    • 1
    • 2
    • 3
    • 4

    可见,对不同的请求有不同的处理。

    参考

    • https://nodejs.org/en/
    • https://nodejs.org/zh-cn/ (中文)
  • 相关阅读:
    数据结构学习笔记 6-1 手撕AVL树 与 LeetCode真题(Java)
    2023湖北民族大学计算机考研信息汇总
    Leetcode刷题笔记--Hot81--90
    深入浅出 《if的表达式》
    C/C++语言100题练习计划 83——背包问题(贪心算法实现)
    Paragon ntfs2022轻松让mac读写NTFS格式磁盘移动硬盘U盘
    mysql数据库连接后缀的作用
    浅谈用匈牙利算法寻找二分图的最大匹配
    TrendMicro:Apex One Server 工具文件夹
    基于Android+vue的大学生综合信息处理软件APP设计
  • 原文地址:https://blog.csdn.net/duke_ding2/article/details/126009321