Node — 第二天

http模块

搭建服务器的步骤

① 导入 http 模块

② 创建 web 服务器实例

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

④ 启动服务器

// ① 导入 http 模块
const http = require('http');

// ② 创建 web 服务器实例
const server = http.createServer();

// ③ 为服务器实例绑定 request 事件,监听客户端的请求
// server.on('事件名称', 处理函数);

// 只要客户端发来请求,则会触发下面的事件
server.on('request', function () {
    console.log('你的请求我收到了');
});

// ④ 启动服务器 
server.listen(3000, function () {
    // 服务器启动之后,会触发这个回调函数
    console.log('my first web server start~');
});

测试:

  • node执行你的JS代码
  • 打开客户端(浏览器、postman),向服务器发送请求(localhost:3000)
  • 查看,代码中的请求事件,是否触发了,如果触发了,表示请求成功了

使用http搭建服务器的问题

  • 代码如果更改了,则需要重新启动服务器,你的代码才会生效

    • Ctrl + C , 先终止服务
    • 再次执行 node xxx.js 重新启动服务即可
  • vscode 终端的使用问题

    在这里插入图片描述

URL的组成

http://www.xxxx.com:3000/yyy/zzz?id=123

  • 协议
    • http
    • https
  • 主机地址(找到服务器)
    • 指向服务器的域名,(localhost 永远指向自己的计算机)
    • 服务器的IP地址 (127.0.0.1 永远指向自己的计算机)
  • 端口
    • 作用是区分服务器上的每个服务的
    • 可以通过 netstat -an 查看已经被占用的端口
  • 文件路径部分(/api/getbooks index.html /a/b/c/xxx.html)
  • 查询字符串部分(GET请求的参数)

获取请求相关的信息

server.on('request',  function (req) {
	// req 对象,是根据 http.IncomingMessage类得来的对象
    // 通过这个对象,我们可以得到请求的相关信息
    req.url // 表示请求的url
    req.method // 表示请求方式
    req.headers // 表示请求头
})

得到请求相关的信息之后,方便服务器做出判断

服务器做出响应

server.on('request',  function (req, res) {
	// 所有和请求相关的信息,都是通过req对象获取的
    // 所有和响应相关的信息,都通过res来完成。res这里是response的意思。
    // console.log(res instanceof http.ServerResponse); // true
    // res.end(); // 用于做出响应
    // res.setHeader(name, value); // 设置响应头
    // res.statusCode // 设置响应状态码
    // res.writeHead(状态码, {响应头})

    // 告诉浏览器,响应的数据是什么类型、什么编码
    // res.setHeader('Content-Type', 'text/html; charset=utf-8');
    // res.statusCode = 404; // 随便设置的状态码,实际中应该是200
    res.writeHead(200, {
        // key: value
        'Content-Type': 'text/html; charset=utf-8',
        'Author': 'LaoTang', // 随便写的,实验一下。值不能用中文
    });
    res.end('你好浏览器,你的请求我收到了,这是给你的回应');
})

GET方式的接口

  • 提供数据给客户端(终极目标)

  • 具体的获取书籍的接口

    • 读取books.json里面的内容
      • fs.readFile() — 读取的结果是json格式
      • require() — 读取的结果是array格式
    • 把读取的结果响应给客户端 — 响应的结果,必须是json字符串格式
    • 遇到的问题
      • 解决跨域的问题 – 设置响应头
      • 解决编码的问题 – 设置响应头

POST方式的接口

  • 接收并保存数据(终极目标)
  • 如何接收POST请求体
    • 定义空字符串,比如str
    • 注册req的data事件,用于接收客户端提交的数据
    • 注册req的end事件,当完全接收到了客户端提交的数据,会触发这个事件
  • 保存数据
  • 做出响应
// 加载所需的模块
const fs = require('fs');
const path = require('path');
const querystring = require('querystring');
// 搭建服务器
const http = require('http');
const server = http.createServer();
server.listen(3006, () => console.log('图书管理案例接口服务启动了'));

server.on('request', (req, res) => {
    // 客户端都会发送什么类型的请求,请求的url又是什么
    let method = req.method; // 获取请求方式
    let url = req.url; // 获取请求的url

    // 定义书籍 books.json的绝对路径
    let filename = path.join(__dirname, 'books.json');

    // 判断,请求的是否是获取图书的接口
    if (method === 'GET' && url === '/api/getbooks') {
        // 说明客户端请求的就是获取书籍的接口
        // 把所有书籍信息响应给客户端
        // 读取books.json里面的内容,把读取的结果响应给客户端

        // 读取json文件,可以直接使用 require 
        let data = require(filename);
        // console.log(data); // 得到一个数组
        res.writeHead(200, {
            'Access-Control-Allow-Origin': '*', // 解决跨域问题
            'Content-Type': 'application/json; charset=utf-8'
        });
        res.end(JSON.stringify({
            status: 200,
            msg: '获取图书成功',
            data: data
        }));

    } else if (method === 'POST' && url === '/api/addbook') {
        // 说明请求的是添加图书的接口
        // console.log(111);
        // 1. 接收客户端提交的数据
        // 1.1 定义一个空字符串,一会要把接收到的数据拼接到空字符串中
        let str = '';
        // 1.2 注册req的data事件,用于接收客户端提交的数据
            // 当接收到客户端的提交的数据的时候,就会触发这个事件,形参chunk就是接收到一部分数据
        req.on('data', (chunk) => {
            str += chunk;
        });
        // 1.3 注册req的end事件,当完全接收到了客户端的数据之后,会触发
        req.on('end', () => {
            // console.log(str); // 完整的数据 
            // bookname=aaa&author=bbb&publisher=ccc

            // 2. 保存到 books.json中
            let old = require(filename); // 得到数组
            let newBook = querystring.parse(str);
            newBook.id = Date.now(); // 临时使用时间戳当做id
            old.push(newBook);
            fs.writeFile(filename, JSON.stringify(old), (err) => {
                if (err) return console.log(err);
                // 没有错误,保存成功
                // 3. 做出响应
                res.writeHead(200, {
                    'Access-Control-Allow-Origin': '*', // 解决跨域问题
                    'Content-Type': 'application/json; charset=utf-8'
                });
                res.end(JSON.stringify({
                    status: 201,
                    msg: '添加图书成功',
                }));
            });
        });
        
    } else {
        res.end('错误');
        // 说明客户端代码写错了。客户端请求了一个不存在的资源
    }
});

npm初步使用

介绍

npm(node package manager)node包管理器。

包是什么?包就是模块。

npm这个工具,在安装node的时候,就已经安装到你的计算机中了。

命令行中执行: npm -v ,如果看到版本号,说明安装成功了。

作用

npm的作用是:管理node模块的工具。

  • 下载并安装第三方的模块
  • 卸载第三方模块
  • 发布模块
  • 删除已发布的模块

第三方模块:

  • 非内置模块,安装完node,还不能使用的模块,需要从网上下载安装,才能使用的模块
  • 第三方模块是个人、公司、组织编写的模块,发布到网上,供我们使用

npm 就是一个管理(下载安装、卸载…)第三方模块的工具

初始化

使用npm工具之前,必须先初始化。

npm init -y
# 或
npm init
# 然后一路回车

初始化之后,会在项目目录中生成 package.json 的文件。

什么第三方模块

非node自带的模块。

是别人写的模块,然后发布到npm网站,我们可以使用npm工具来下载安装别人写的模块。

第三方模块,都是在node核心模块的基础之上,封装了一下,实现了很多非常方便快速简洁的方法。

目前,npm网站收录了超过 150万个第三方模块。

安装卸载项目模块

下载安装第三方模块

npm install 模块名
npm i 模块名

卸载模块

npm uninstall 模块名
npm un 模块名

关于项目模块的说明

  • 下载安装的模块,存放在当前文件夹的 node_modules 文件夹中,同时还会生成一个记录下载的文件 package-lock.json
  • 下载的模块,在哪里可以使用
    • 在当前文件夹
    • 在当前文件夹的子文件夹
    • 在当前文件夹的子文件夹的子文件夹
  • 怎样使用第三方模块
    • 和使用内置模块一样,需要使用 require 加载模块
    • 调用模块提供的方法完成工作(一般好的模块都会用使用文档的)

演示下载安装第三方模块:moment

这里演示一个处理时间日期的模块 – moment

下载安装moment模块

npm init -y
npm i moment

演示使用moment模块处理时间

// 加载模块
const moment = require('moment');

console.log(moment().format('YYYY-MM-DD hh:mm:ss'));
// 官网:http://momentjs.cn

全局模块

  • 全局安装的模块,不能通过 require() 加载使用。

  • 全局安装的模块,一般都是命令或者工具。

  • 安装方法,在安装模块的命令后面,加 -g

    npm i 模块名 -g
    # 或
    npm i -g 模块名
    
  • 卸载方法(也是多一个 -g

    npm un 模块名 -g
    
  • 全局安装的模块,在系统盘(C盘)

    • 通过命令 npm root -g 可以查看全局安装路径

mac安装过程可能出现权限问题,可以使用 sudo npm i xxx -g

全局安装nodemon模块

  • 安装命令

    npm i nodemon -g
    
  • nodemon的作用:

  • 代替node命令,启动服务的,当更改代码之后,nodemon会自动帮我们重启服务。

  • 运行nodemon,如果报错如下:
    在这里插入图片描述

  • 解决办法是:

    • 管理员方式,打开命令行窗口
    • 执行 set-ExecutionPolicy RemoteSigned;
    • 在出现的选项中,输入 A,回车。即可

更改镜像源

镜像源,就是下载安装第三方模块的网站。

我们下载的第三方模块都是从国外的npm主站下载的,速度比较慢。

淘宝在国内对npm上的第三方模块做了一个备份,也就是说,我们可以从国内下载第三方模块。

除了淘宝之外,还有很多其他镜像源。

简单的更改镜像源方法:

  • 全局安装 nrm 的模块
  • npm i nrm -g
    • nrm 用于管理镜像源
  • 使用nrm
    • nrm ls 通过这个命令,可以查看可用的镜像源
    • nrm use taobao ,切换下载模块的网站为淘宝
      在这里插入图片描述

注意 :如果 nrm 安装失败,请修改电脑的环境变量,给环境变量添加上 npm 的绝对地址,再次查询即可

查询版本

nrm - y

在这里插入图片描述

使用已下nmp 代码可以根据 package.json重新安装node_modules中的模块信息

npm  i

如果安装出现错误:
1. 查看 npm 版本
2. 镜像源的配置

猜你喜欢

转载自blog.csdn.net/weixin_44694682/article/details/105797739