目录
path模块作用:拼接文件路径(类似模板字符串),自动修复路径分割符错误
为什么要学习node.js
服务器相关
1.
了解客户端浏览器与服务端后台的交互过程
,可以在以后的前端开发工作中与后台人员之间的沟通更加容易理解
虽然以后工作中不一定用的上nodejs,但是通过对服务端开发的了解,能够让你在日常工作中与公司后台人员之间的沟通变得更加轻松
2.了解服务端开发的一些特性,可以在以后的工作中,当我们前端与后台交互出现bug问题时,能够更快速的定位bug是出现在自己的客户端还是别人的服务端。
作为一名前端人员,如果对后台不了解,那么以后在与后台交互的开发中有可能明明是后台的问题,但是由于自身对后台的不了解再加上前期的经验不足,导致解决问题的时间增加(加班)。
3.了解服务端开发的过程,可以为以后的职业发展打下一定的基础(全栈工程师)
框架前置课
vue框架能够正常开发的前提是你的电脑必须要安装node环境
1.nodejs作为vue框架之前的一个课程,在学习vue的过程中,需要使用nodejs相关的一些知识点。
2.学习nodejs有助于为后续框架课程打下良好的基础
什么是node.js
1.Node.js 是一个构建于 Chrome V8引擎之上的一个Javascript 运行环境
Node
是
一个运行环境
,作用是让js拥有开发服务端的功能2.nodejs的作用 : 使用js语言开发服务器
Node.js做后台开发
node.js下载与安装
打开终端(cmd),输入
node -v
,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令
,则表示未安装
nodejs如何运行
1.打开node自带的REPL解释器
*原理:nodejs运行环境来执行js
2.打开电脑终端,执行命令:node [js文件名]
node:你的操作系统会自动开启node环境
[文件名]:你的操作系统会自动把这个文件的js代码,放入node环境执行
3.vscode:点击右键选择终端打开,输入:node文件名
原理和第2步骤一模一样的,只是用起来更加方便.
服务端js与客户端js区别
1.客户端JS由三部分组成
ECMAScript:确定js的语法规范
DOM:js操作网页内容
BOM:js操作浏览器窗口
2.服务端JS只有ECMAScript
因为服务端是没有界面的
==在nodejs中使用dom与bom的api程序会报错==
nodejs模块化介绍
1.nodejs是一个渐进式框架, 我们后面要学习的vue框架也是渐进式框架
2.什么是渐进式框架呢 : 一个功能对应一个模块(js文件), 需要用的时候导入即可
说人话:
非渐进式框架 : 套餐, 一次性导入所有的功能。 无论是的项目用还是不用(浪费资源)
渐进式框架 : 自助餐。 吃什么用什么,不浪费。(节省资源)
fs模块
1.前端如何使用第三方包
(1)导包:<scriptsrc=“文件路径“></script>
*导包原理:本质是得到一个全局对象,
(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捕捉异常
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('我执行了吗?');
}
path路径模块
nodejs相对路径
服务端相对路径./和前端相对路径./区别
1.前端./:相当于当前文件所在目录绝对路径(固定的,永远都是当前文件的目录路径)
2.服务端./:相对于当前执行node命令所在的路径(不固定,在哪里执行node,./就是哪个目录)
总结:在nodejs中,读取文件一般不能使用相对路径.只能用绝对路径
nodejs使用绝对路径:
__dirname:当前文件所在目录的绝对路径
__filename:当前文件自己的绝对路径
我们一般使用__dir目录
console.log(__dirname);
console.log("..............");
console.log(__filename);
下图中,第一个是__dirname,第二个是__filename
path模块作用:拼接文件路径(类似模板字符串),自动修复路径分割符错误
// 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('写入成功');
}
})
http模块
http模块搭建服务器
//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模块响应客户端请求
浏览器请求
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('服务器开启成功');
})
nodejs响应客户端html文件
(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('服务器开启成功');
})