目录
path模块作用:拼接文件路径(类似模板字符串),自动修复路径分割符错误
1.
了解客户端浏览器与服务端后台的交互过程,可以在以后的前端开发工作中与后台人员之间的沟通更加容易理解
虽然以后工作中不一定用的上nodejs,但是通过对服务端开发的了解,能够让你在日常工作中与公司后台人员之间的沟通变得更加轻松
2.了解服务端开发的一些特性,可以在以后的工作中,当我们前端与后台交互出现bug问题时,能够更快速的定位bug是出现在自己的客户端还是别人的服务端。
作为一名前端人员,如果对后台不了解,那么以后在与后台交互的开发中有可能明明是后台的问题,但是由于自身对后台的不了解再加上前期的经验不足,导致解决问题的时间增加(加班)。
3.了解服务端开发的过程,可以为以后的职业发展打下一定的基础(全栈工程师)
vue框架能够正常开发的前提是你的电脑必须要安装node环境
1.nodejs作为vue框架之前的一个课程,在学习vue的过程中,需要使用nodejs相关的一些知识点。
2.学习nodejs有助于为后续框架课程打下良好的基础
1.Node.js 是一个构建于 Chrome V8引擎之上的一个Javascript 运行环境
Node
是一个运行环境,作用是让js拥有开发服务端的功能2.nodejs的作用 : 使用js语言开发服务器
Node.js做后台开发


打开终端(cmd),输入
node -v,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令,则表示未安装

1.打开node自带的REPL解释器
*原理:nodejs运行环境来执行js

2.打开电脑终端,执行命令:node [js文件名]
node:你的操作系统会自动开启node环境
[文件名]:你的操作系统会自动把这个文件的js代码,放入node环境执行

3.vscode:点击右键选择终端打开,输入:node文件名
原理和第2步骤一模一样的,只是用起来更加方便.

1.客户端JS由三部分组成
ECMAScript:确定js的语法规范
DOM:js操作网页内容
BOM:js操作浏览器窗口
2.服务端JS只有ECMAScript
因为服务端是没有界面的
==在nodejs中使用dom与bom的api程序会报错==
1.nodejs是一个渐进式框架, 我们后面要学习的vue框架也是渐进式框架
2.什么是渐进式框架呢 : 一个功能对应一个模块(js文件), 需要用的时候导入即可
说人话:
非渐进式框架 : 套餐, 一次性导入所有的功能。 无论是的项目用还是不用(浪费资源)
渐进式框架 : 自助餐。 吃什么用什么,不浪费。(节省资源)
1.前端如何使用第三方包
(1)导包:
*导包原理:本质是得到一个全局对象,
(2)用包:调用对象的方法
2.服务端如何使用 模块
(1)导入模块: const 变量名=require('文件路径')
- // (1)导入模块
- const fs = require('fs');//node.js安装在c盘不写路径,直接写fs,可以找到路径
- // console.log(fs);//fs是一个对象,有许多方法
-
- // (2)使用方法
- /**
- @description:读取文件
- @param {string} path:文件路径
- @param {string} encoding :文件编码 默认:二进制 utf8 中文
- @param {function}(err,data)=>{ err:错误信息,data:读取到的数据}
- *
- * @return:
- */
- fs.readFile('./data/aaa.txt', 'utf8', (err, data) => {
- if (err) {//失败
- // console.log(err)
- throw err
-
- } else {//成功
- console.log(data)
- }
- })
- // (1)导入模块
- const fs = require('fs')
-
- // (2)使用模块
- /**
- @description:写入文件
- @param {string} path:文件路径
- @param {stringlbuffer} data:要写入的数据
- @param {string} encoding:文件编码,一般不传。nodejs会自动识别data设置正确的类型
- @param {function} err=>{ }
- @return:
- *
-
- */
- fs.writeFile('./data/bbb.txt', '爱仕达福利姬看是否', err => {
- if (err) {
- throw err
- } else {
- console.log('写入成功');
- }
- })
js从上往下解析代码流程
1.判断是同步还是异步
2.如果是同步,则立即执行
3.如果是异步,则不执行,而是放入事件循环中(Event Loop)
4.所有代码解析完毕之后,开始执行事件循环中的异步代码
同步与异步区别(掌握)
·1.同步会阻塞线程,异步不会
·2.同步有序执行,异步无序执行
·3.同步没有回调函数,异步有回调函数
*异步一般都有回调,但不是所有的回调都是异步 数组的sort方法是回调但不是异步
异步操作
1.不会阻塞线程(性能高)
2.无序执行
3.有回调函数
- // 异步async 2.同步有序执行,异步无序执行
- /*异步操作
- 1.不会阻塞线程(性能高)
- 2.无序执行
- 3.有回调函数
- */
-
- fs.readFile('./data/aaa.txt', (err, data) => {//readfile是同步,后面的回调函数是异步
- if (err) {
- throw err
- } else {
- console.log(1)
- }
- }
- )
- fs.readFile('./data/aaa.txt', (err, data) => {
- if (err) {
- throw err
- } else {
- console.log(22)
- }
- }
- )
-
- fs.readFile('./data/aaa.txt', (err, data) => {
- if (err) {
- throw err
- } else {
- console.log(333)
- }
- }
- )
- fs.readFile('./data/aaa.txt', (err, data) => {
- if (err) {
- throw err
- } else {
- console.log(4444)
- }
- }
- )
不是从上到下执行,并且每次执行顺序不同

同步操作
1.会阻塞线程(性能低)
2.有序执行
3.没有回调函数
- //同步操作
- /*
- 1.会阻塞线程(性能低)
- 2.有序执行
- 3.没有回调函数
- */
-
- const data0 = fs.readFileSync('./data/aaa.txt', 'utf8')
- console.log("0" + data0);
- const data1 = fs.readFileSync('./data/aaa.txt', 'utf8')
- console.log("1" + data1);
- const data2 = fs.readFileSync('./data/aaa.txt', 'utf8')
- console.log("2" + data2);
从上到下执行,每次输出相同

try-catch:用于捕捉代码的异常
*特点:代码出现爆红(语法错误),也不会对后面代码产生影响
2.try-catch语法:
try{
//代码:如果可以正常执行,就执行
}catch(err){
//如果try代码出现错误,就会执行catch代码。err就是错误信息
}
3.应用场景:当有一段代码,不确定能不能执行,希望它如果不能执行也不会影响后面代码。
- try {
- for (let i = 0; i < 3; i++) {
- obj[i] = i * 7
-
- }
- } catch (err) {
- console.log(err)
- } finally {
- console.log('我执行了吗?');
- }
服务端相对路径./和前端相对路径./区别
1.前端./:相当于当前文件所在目录绝对路径(固定的,永远都是当前文件的目录路径)
2.服务端./:相对于当前执行node命令所在的路径(不固定,在哪里执行node,./就是哪个目录)
总结:在nodejs中,读取文件一般不能使用相对路径.只能用绝对路径
nodejs使用绝对路径:
__dirname:当前文件所在目录的绝对路径
__filename:当前文件自己的绝对路径
我们一般使用__dir目录
- console.log(__dirname);
- console.log("..............");
- console.log(__filename);
下图中,第一个是__dirname,第二个是__filename

- // path模块作用:拼接文件路径(类似模板字符串),自动修复路径分割符错误
- const path = require('path')
- let newPath = path.join(__dirname,'aaa.txt')//自动修复路径分隔符
- console.log(newPath)
自动在路径间增加/分隔符
- fs.writeFile(`${__dirname}/aaa.txt`, '爱仕瓯江口姬看是否', err => {
- if (err) {
- throw err
- } else {
- console.log('写入成功');
- }
- })
- //1.导入模块(安装服务器软件phpstudy)
-
- const http = require('http')
- //2.创建服务器(开启软件窗口)
- //浏览器每发一次请求,回调函数就会执行一次
-
- const app = http.createServer((req, res) => {
- //1.req(request):请求报文
- console.log(req.url, decodeURI(req.url))
- //2.处理
- //3.res(response):响应报文
-
- })
- //3.开启服务器(点击软件窗口启动按钮)
- /**
- * @description:开启nodejs服务器
- * @param {number} :port:端口号
- *一个计算机只有一个网线,但是有很多应用程序都可以访问网络。所以为了便于管理,每一个应用程序在系
- 统中都有一个唯一的编号,端口号。(端口号:应用程序编号 0-65535)
- * @param {string} :hostname:主机(ip地址)
- * @param {function} :()=>{//开启成功回调}
- * @return:
- */
- app.listen(3000, '192.168.1.8', () => {
- console.log('服务器开启成功');
- })
浏览器请求
http://"IP地址":"端口号"
- //1.导入模块(安装服务器软件phpstudy)
-
- const http = require('http')
- //2.创建服务器(开启软件窗口)
- //浏览器每发一次请求,回调函数就会执行一次
-
- const app = http.createServer((req, res) => {
- //1.req(request):请求报文
- console.log(req.url, decodeURI(req.url))
- //2.处理
- //3.res(response):响应报文
- // 中文:设置响应头,服务器告诉浏览器我给你的数据是什么格式
- res.end('66666!!you get it!!')
-
- })
- //3.开启服务器(点击软件窗口启动按钮)
- //ip如果不写,默认就是本机ip:127.0.0.1
- app.listen(3000, () => {
- console.log('服务器开启成功');
- })

if分支语句判断请求报文的url,然后返回不同的响应报文res.end
- //1.导入模块(安装服务器软件phpstudy)
-
- const http = require('http')
- //2.创建服务器(开启软件窗口)
- //浏览器每发一次请求,回调函数就会执行一次
-
- const app = http.createServer((req, res) => {
- //1.req(request):请求报文
- console.log(req.url, decodeURI(req.url))
- //2.处理
-
- if (req.url === '/index') {
- res.end('index')
- } else if (req.url === '/login') {
- res.end('login ')
- }else{
- res.end('404 NOT FOUND')
- }
- //3.res(response):响应报文
-
- })
- //3.开启服务器(点击软件窗口启动按钮)
- //ip如果不写,默认就是本机ip:127.0.0.1
- app.listen(3000, () => {
- console.log('服务器开启成功');
- })


(1)请求:前端发送请求
(2)处理:后端根据不同的请求路径,使用fs模块读取不同的html文件数据
(3)响应:后端把读取到的html数据响应给前端。前端浏览器渲染html文件
if分支语句判断请求报文的url,然后通过fs读取html文件返回不同的响应报文res.end
-
- //1.导入模块
- const fs = require('fs');
- const http = require('http')
- //2.创建服务器(开启软件窗口)
- //浏览器每发一次请求,回调函数就会执行一次
-
- const app = http.createServer((req, res) => {
- //1.req(request):请求报文
- console.log(req.url, decodeURI(req.url))
- //2.处理
-
- if (req.url === '/index') {
- fs.readFile(`${__dirname}/index.html`, (err, data) => {
- if (err) {//失败
- throw err
- } else {//成功
- // 3.将读取的文件数据响应给客户端
- res.end(data)
- }
- })
- } else if (req.url === '/login') {
- fs.readFile(`${__dirname}/login.html`, (err, data) => {
- if (err) {//失败
- throw err
- } else {//成功
- // 3.将读取的文件数据响应给客户端
- res.end(data)
- }
- })
- } else {
- res.end('404 NOT FOUND')
- }
- //3.res(response):响应报文
-
- })
- //3.开启服务器(点击软件窗口启动按钮)
- //ip如果不写,默认就是本机ip:127.0.0.1
- app.listen(3000, () => {
- console.log('服务器开启成功');
- })
