nodejs(1)

137 阅读8分钟

nodejs第一天

一、什么是node.js

1.node.js定义

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

2.名词解释

(1)chrome V8引擎: 在chrome浏览器用来解析和执行js代码的工具;

(2)运行时:理解为一个容器,用来运行代码的环境;这个环境让JS有读

(3)写文件,操作数据库,开启web服务器等能力

注意:Node.js 只是JS的服务端运行环境,不是一门语言(不需要学习新语言),而只需要学习它里面新的Api

3.Node.js环境与浏览器环境的区别

(1)在浏览器端:js由三部分组成:ECMAScript + BOM + DOM

(2)在NoeJS端:由ECMAScript + 内置模块(fs, http, path等) + 第三方模块(别人开发的模块)

(3)注意:NodeJS中没有DOM,也没有BOM,也没有window对象。

(4)浏览器是JS的前端运行环境,Node.js是JS的后端运行环境

二、下载安装node.js

1.下载地址:

nodejs.org/zh-cn/(推荐下载…

2.点击下载到的安装包,一路下一步默认安装

(1)不能安装到中文目录如d:/软件,建议一直点击next即可

(2)安装完成之后, 它不会在桌面出现快捷图标

3.打开小黑窗输入 node -v 能看到版本号表示安装成功(点击对应文件--->搜索cmd)

(1)按 windows + R 运行窗口中输入cmd 回车即可打开 (2)在任意目录的最上方路径输入框中输入 cmd 回车接口打开 (推荐) (3)在任意目录中按住 shift键 + 鼠标右键后在弹出菜单中点击 在此处打开命令窗口 或 在此处打开PowerShell窗口即可打开 (4)在VSCode中,任意一个js文件上鼠标右键,选择在 集成终端中打开

4.nodejs环境中执行js步骤

(1)场景:

vscode中新建一个01nodejs执行体验.js,console.log()输出一段文本, 利用node执行后看到输出表示执行成功 (2)步骤: ①新建01nodejs执行体验.js ②编写代码:console.log('nodejs执行输出啦'); ③打开小黑窗,输入 node 01nodejs执行体验.js 回车看结果

(3)操作截图 1652183842122.png

1652184000714.png

1652184013609.png

5.小黑框常用命令及按键

1652184095771.png

复制和粘贴 在小黑窗中复制内容:选中内容,再点鼠标右键 把粘贴板中的内容复制到小黑窗: 直接在小黑窗点鼠标右键

三、核心模块-文件读写fs

1.核心模块

就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用啦。相当于学习js时使用的Math对象一样

2.自定义模块

程序员自己写的模块。相当于我们在学习js时的自定义函数

3.第三方包

其他程序员写好的模块,nodejs生态提供了一个专门的工具npm来管理第三方模块,例如我们前面学习的echarts

4.如何导入模块/包
const 变量名 = require ("核心模块名")

// 导入fs模块和Path核心模块的代码
const fs =require("fs")
const path=require("path")
5.同步与异步的概念理解
(1)同步:

多个功能按先后顺序执行,后面任务等待前面任务执行完毕后才会执行。如平常大家讨论问题时说:让我说完,意思是说我说完你再说。

优缺点:如果前面任务执行太久会阻止后面任务的执行,降低程序执行性能,造成用户体验差,优点是编程方式简单,便于理解执行过程。

(2)异步:

和同步相反,也就是在发出一个功能调用时,不管没有没得到结果,都继续往下执行。就像两个人吵架一样,各说各的,不管对方有没有说完。

优缺点:不会造成阻塞,提升了程序执行性能,用户体验好,缺点是编程方式复杂,执行过程理解难度较大,会形成回调函数的嵌套。

(3)异步的表现形式:以一个回调函数的方式来实现异步任务的执行
6.fs模块异步读取文件
(1)目标:掌握fs.readFile异步读取文件的写法和错误处理
(2)语法
fs.readFile(path[, options], callback)

参数:path,读取文件的路径(相对路径或绝对路径)
     options:读取文件的参数配置,通常用一个utf8字符串表示即可
     callback:读取完毕的回调函数(err,data)=>{}    	

(3)异步读取文件(读取顺序按文件大小顺序)
const fs = require("fs");
// utf-8可读取文本 data.toString()可省略
fs.readFile("./1.txt", "utf-8", (err, data) => {
   if (err) {
     console.log("出错");
   } else {
     console.log("data", data.toString());
   }
});


// 简化写法
const fs = require("fs");

// utf-8可读取文本 data.toString()可省略
fs.readFile("./1.txt", "utf-8", (err, data) => {

  if (err) return console.log("出错");
  // 情况2:读取错误成功
  // utf-8可读取文本 data.toString()可省略
  console.log("data", data);
});
(4)异步写入文件
const fs = require("fs");
// 覆盖形式写入 原本文本内容将被覆盖
fs.writeFile("./1.html", "8855", (err) => {
// 如果没错我 err null

  if (err) return console.log("写入错误");

  console.log("写入成功");
});
(5)异步写入对象格式数据
const fs = require("fs");
const { json } = require("stream/consumers");
const arr = [{ id: 1 }, { id: 2 }];

// 注意事项
// fs.writeFile()  //第二个参数的格式要求为 字符串
// JSON.stringify()  //把对象转换成 json 字符串
const str = JSON.stringify(arr);

console.log(str);

fs.writeFile("./对象.json", JSON.stringify(arr), (err) => {
  if (err) return console.log("写入错误");

  console.log("写入成功");
});

(6)课堂练习-读写文件

const fs = require("fs");

const obj = { name: "刘备" };
// 1.读完文件
fs.readFile("./db/datajson.json", (err, data) => {
  // 2.读取失败
  if (err) return console.log("读取出错");
  //   console.log(data.toString());
  //   3.读取成功,字符串转数组
  const arr = JSON.parse(data.toString());
  // 4.追加数据obj,内存中追加
  arr.push(obj);
  // 5. 写入文件,数组转字符串
  fs.writeFile("./db/datajson.json", JSON.stringify(arr), (err) => {
    if (err) return console.log("读取出错");
    console.log("写入成功", JSON.stringify(arr));
  });
});

7.同步读取/写入文件

(1)同步读取文件
const fs = require("fs");
console.log(111);

const data = fs.readFileSync("./图.jpg");
const data2 = fs.readFileSync("./1.txt");

console.log(data);

console.log(333);
console.log(data2.toString());
console.log(444);
(2)同步写入文件
const fs = require("fs");
try {
  fs.writeFileSync("./01.html", "准备下课");
  console.log("write in success");
} catch (error) {
  console.log("write in false");
}

四、服务器创建

1.服务器

提供网络服务的一台机器,通过在自己的电脑上安装特殊的软件(或者是运行某段特殊的代码)来提供服务。简单来说:服务器 = 电脑 + 能给其它电脑提供服务的软件

2.客户端与服务器

提供服务的是服务器,享受服务的是客户端

3.web服务器(重点学习)

安装apache/tomcat/iis或者在nodejs环境写代码来提供:图片/视频/音频浏览/新闻数据浏览等服务的服务器

4.HTTP协议
(1)协议:

制定客户端与服务器之间的通讯规则,不同的协议的作用也不同,我们主要了解HTTP协议

(2)http协议

定义:HTTP(HyperText Transfer Protocol) 超文本传输协议,浏览器与web服务器都要遵守的协议

(3)HTTP 协议中明确规定了请求数据和响应数据的格式(报文)

浏览器 请求 资源 要遵守 http 协议: 请求报文(请求行,请求头,请求体) 服务器 返回 资源 要遵守 http 协议: 响应报文(响应行,响应头,响应体)

5.服务器创建步骤

(1)引入http核心模块

const http = require ("http")

(2)使用createServer来创建服务

// req request 请求对象
// res response 响应对象
const server=http.createServer(req, res) => {
    
})

(3)使用listen来启动服务,端口为8001(端口可以修改 0 - 65535) 在浏览器输入http://127.0.0.1:8001回车即可看到服务器响应回来的信息:OK

server.listen(端口号, () => {
 
});
6.创建服务器-案例
// 1.导入http
const http = require("http");
// 2.创建服务
const server = http.createServer((request, response) => {
  // req 请求
  // res 响应
  // method 请求方式
  // url 地址
  console.log("请求发送成功", request.method, request.url);
  response.end("ok");
});
// 3.开启监听
server.listen(8001, () => {
  console.log("web服务器准备就绪:127.0.0.1:8001可以访问");
});
7.根据不同的url地址响应不同的内容

(1)关键代码

if (request.url === "/") {
    response.end("ok");
  } else if (request.url === "/joke") {
    // 响应中文  浏览器默认不认识 需添加响应头
    response.end("/joke");
  } else if (request.url === "/wuwuwu") {
    // 服务器告诉浏览器,响应的内容类型为: 文本,编码格式为 utf8
    res.setHeader("content-type", "text/html;charset=utf8");
    response.end("呜呜呜");
  } else {
    response.end("404");
  }

(2)完整代码

// 1.导入http
const http = require("http");
// 2.创建服务
const server = http.createServer((request, response) => {
  // req 请求
  // res 响应
  // method 请求方式
  // url 地址
  console.log("请求发送成功", request.method, request.url);
  if (request.url === "/") {
    response.end("ok");
  } else if (request.url === "/joke") {
    // 响应中文  浏览器默认不认识 需添加响应头
    response.end("/joke");
  } else if (request.url === "/wuwuwu") {
    // 服务器告诉浏览器,响应的内容类型为: 文本,编码格式为 utf8
    res.setHeader("content-type", "text/html;charset=utf8");
    response.end("呜呜呜");
  } else {
    response.end("404");
  }
  // 多个res.end被调用会导致服务器崩溃
  //   response.end("404");
});
// 3.开启监听
server.listen(8001, () => {
  console.log("web服务器准备就绪:127.0.0.1:8001可以访问");
});

五、作业

1.案例一(将obj写入json中)
const fs = require("fs");
const arr1 = [];
const obj1 = { name: "后裔", skinname: "精灵王" };
const obj2 = { name: "程咬金", skinname: "功夫厨神" };
arr1.push(obj1);
fs.writeFile("./db/data1.json", JSON.stringify(arr1), (err) => {
  if (err) return console.log("读取出错");
  console.log("写入成功", JSON.stringify(arr1));
});
arr1.push(obj2);
fs.writeFile("./db/data1.json", JSON.stringify(arr1), (err) => {
  if (err) return console.log("读取出错");
  console.log("写入成功", JSON.stringify(arr1));
});

2.案例二(读取图片,并写入创建复制新的图片)
const fs = require("fs");
fs.readFile("./3.jpg", (err, data) => {
  if (err) return console.log("false");
  console.log(data, "success");
  fs.writeFile("./4.jpg", data, (err) => {
    if (err) return console.log("false");
    console.log("success");
  });
});

3.案例三(随机话语)
const http = require("http");
const arr = [
  "子曰:“为政以德,譬如北辰,居其所而众星共之。”",
  "子曰:“不患人之不己知,患不知人也。”",
  "子曰:“温故而知新,可以为师矣。”",
  "曾子曰:“慎终追远,民德归厚矣。”",
  "有子曰:“信近于义,言可复也。恭近于礼,远耻辱也。因不失其亲,亦可宗也。”",
  "子贡问君子。子曰:“先行其言而后从之。”",
];
const server = http.createServer((request, response) => {
  if (request.method === "GET") {
    console.log("send success", request.method, request.url);
    let num = Math.round(Math.random() * (arr.length - 1));
    // 服务器告诉浏览器,响应的内容类型为: 文本,编码格式为 utf8
    response.setHeader("content-type", "text/html;charset=utf8");
    response.end(arr[num]);
  }
});
// });

// 3.开启监听
server.listen(8001, () => {
  console.log("web服务器准备就绪:127.0.0.1:8001可以访问");
});