node.js总结
1、node.js和js知识结构的关系
相同点:node.js和js都要学习ECMAScript(通俗讲就是js基础知识)
不同点:node.js不学习js的DOM和BOM,要学习Node模块API
2、node.js里面重要的nrm的了解
2.1 nrm的一些基本命令
- npm install nrm –g (这个命令是下载nrm的命令,-g是全局安装)
- npm install nodemon(安装了一个nodemon)
- npm uninstall xx(卸戟程序)
- nodemon xx.js(这是运行js文件)
- ctrl+c(是终止服务)
3、全局安装和不是全局安装的区别
区别:全局安装安装完以后是都可以使用的,所有的项目都可以进行使用,而非全局安装是只能在本项目内使用的
3、掌握读取和写入文件的同步和异步写法以及区别
3.1 读取文件
同步的写法
let fs=require('fs')
// readFileSync的第一个参数是要读文件路径
let res=fs.readFileSync('./a.txt','utf-8')
console.log(res)
异步的写法
let fs=require('fs')
fs.readFile('./a.txt','utf-8',(err,data)=>{
if(!err){
console.log(data)
}else{
console.log(err)
}
})
不同
- 首先是语法上的不同,同步主要关键字(readFileSync),异步的主要关键字(readFile)
- 同步执行时从上到下一步一步,异步是使用回调函数
3.2 写入文件
同步的写法
const fs =require('fs')
fs.writeFileSync('./a.txt','是啊释怀吧','utf-8')
//writeFileSync第一个参数是文件路径,第二个参数是内容,第三个参数是字符集
异步的写法
const fs = require('fs')
fs.writeFile('./a.txt','今天很想你',err=>{
console.log('文件写入成功')
})
5、箭头函数
介绍:箭头函数主要是用来代替我们的匿名函数的
5.1 具体使用方法
//这是一个正常的匿名函数
var f1=function(a,b){
console.log(a+b)
}
f1(3,4)
//这是上面匿名函数演变过来的箭头函数,他们两个的输出结果是一样的
var f1=(a,b)=>{
console.log(a+b)
}
f1(3,4)
//这是一个只有一个参数的匿名函数
var f1=function(a){
console.log(a)
}
f1(10)
//这是一个参数的箭头函数,可以把参数的小括号再去掉
var f1=a=>{
console.log(a)
}
f1(3)
6、同步异步问题
1、什么是同步代码,什么是异步代码
-
同步:
console.log('before'); console.log('after'); //同步代码的执行顺序是从上到下的,是单线程的,上面代码没有 //没有执行完毕,下面代码是不能执行的
-
异步:定时器,还有node.js里面的异步读取文件
console.log('before'); setTimeout( () => { console.log('last'); }, 2000); console.log('after'); //在这代码里面就有定时器,这就是一个异步代码,他的输出是before,after,last,定时器是 //两秒后执行,所以同步代码先执行完毕,最后异步代码进行执行,在开发的过程中也是如此,所有的 //异步代码都会等同步代码执行完毕在进行执行
2、解决同步异步代码方法
2.1、以异步读取文件为例
2.1.1、异步读取文件的流程
const fs=require("fs");
/**
* readFile 方法是一个异步方法,读取地内容不是通过返回值
* 而是需要提供一个回调函数,会将读取地内容复制给data变量
* 所以只有在回调函数中,才可以获取读取的内容,里面变量err
* 是错误信息地
*
*/
fs.readFile("a.txt","utf8",function(err,data){
console.log(data);
});
2.2、多个异步文件一起读取的问题
fs.readFile("a.txt","utf8",function(err,data){
console.log(data);
});
fs.readFile("b.txt","utf8",function(err,data){
console.log(data);
});
fs.readFile("c.txt","utf8",function(err,data){
console.log(data);
});
fs.readFile("d.txt","utf8",function(err,data){
console.log(data);
});
/**
* 这是多个异步读取文件一起执行,结果是
* 我是c
* 我是a
* 我是d
* 我是b
* 异步读取文件的结果是不可控的,没有顺序的
*/
2.3、多个异步文件一起读取问题的解决方法
2.3.1解决方法一回调函数(不太推荐使用)
fs.readFile("a.txt","utf8",function(err,data){
console.log(data);
fs.readFile("b.txt","utf8",function(err,data){
console.log(data);
fs.readFile("c.txt","utf8",function(err,data){
console.log(data);
fs.readFile("d.txt","utf8",function(err,data){
console.log(data);
});
});
});
});
/**
* 回调函数的方式,在文件读取完a文件后,在读取b文件,读取完b文件以后,在读取c文件
* 以此类推,这样是可以解决异步读取文件顺序不当的问题,
*/
**优点:**自我感觉思路比较清晰,更加好理解
**缺点:**就是代码嵌套很多,不利于代码的维护,这种写法比较落后
2.3.2解决方法二promise(推荐使用)
简单使用方式
/**
* Promise方法的使用
* 1)将异步读取文件的代码放在promise 类的构造函数种
* 2)读取文件成功或者失败后,不直接处理,而是调用resolve和reject函数
*/
let p1=new Promise((resolve,rejects)=>{
fs.readFile('a.txt','utf8',(err,data)=>{
if(err){
rejects('读取文件失败')
}else{
resolve(data);
}
})
})
/**
* ther方法的参数是一个匿名函数,此函数会作为实参赋值给promise中的resolve
* catch方法的参数是一个匿名函数,此函数会作为实参赋值给promise中的rejects
*/
p1.then((data)=>{
console.log(data)
}).catch((err)=>{
console.log(err)
})
/**
* 在进行文件读取的时候所有异步读取文件还是在继续异步无规律的读取中,
* 在输出的时候,读取上一个文件结束后,return调用指定文件在进行输出,
* 这样就控制了异步文件读取输出不受控制的现象了
*/
p1.then((data)=>{
console.log(data)
return p2
}).then(data=>{
console.log(data)
return p3
}).then(data=>{
console.log(data)
return p4
}).then(data=>{
console.log(data)
})
**promise方法总结:**自我理解就是他没有改变异步读取文件读取的顺序,他是在改变读取完以后文件内容输出的顺序(这是自我的理解)
7、数据库操作
1、使用命令下载数据库
npm install mysql 安装数据库
2、创建连接
//1、这是引入mysql模块
const mysql = require('mysql')
//2、进行数据库的配置
const con = mysql.createConnection({
host: 'localhost', //地址
user: 'root', //名称
password: 'root', //数据库连接密码
port: '3306', //端口号,这个可以省略
database:'node' //这是你要使用数据库的名字
})
//3、进行开启数据库
con.connect()
//4、连接数据库
let connect=mysql.createConnection(db_config);
connect.connect(function(err){
if(err){
console.log(`mysql连接失败:${err}`);
}else{
console.log('mysql连接成功');
}
})
3、数据操作命令
let sqlQuery="select * from connect"; //这是查询语句,和正常的查询语句一样
connect.query(sqlQuery,function(err,result){xingxin
if(err){
console.log(`SQL error:${err}!`); //查询完毕后err是返回报错信息,没有报错则啥都不返回
}
else{
console.log(result) //result就是返回查询出来的结果
}
})
4、关闭数据库
connect.end((err)=>{
if(err){
console.log(`mysql关闭失败:${err}!`);
}else{
console.log('mysql关闭成功!');
}
})
8、module.exports和exports的介绍
1、简单介绍
module.exports和exports都是向外部暴露内部的变量,以便于外部接收到变量,更加容易的去操作
2、如何使用
//这是文件a
var a1=10
//我想使用文件a里面的a1变量,这个时候文件a就要把a1变量暴露出来
exports.a1=a1 //暴露变量a1,暴露方法不止一种
module.exports{ //这个是以对象的方式暴露出来,这种方式更加的合理好用
a1
}
//这是文件b
//变量a1已经暴露出来,这个时候就可以用了
const b_module=require('./a.js') //引入文件a,在进行使用
console.log(b_module.a1)
9、对象的继承(复习内容)
1、继承关键字:extends
//首先这是通过class类的方式创建的对象
class BaseModel{ //这个是父类,里面定义了两个方法
constructor(msg,data){
this.msg=msg
this.data=data
}
}
class SuccessModel extends BaseModel{ //这个是子类,通过extends来继承的父类BaseModel,
constructor(msg,data){
super(msg,data)
this.errno=0;
}
}
class ErrorModel extends BaseModel{
constructor(msg,data){
super(msg,data)
this.errno=-1;
}
}
//super:既可以当作函数处理,也可以当作对象使用
//1∶作为函数调用时,代表父类的构造函数,只能用在子类的构造函数之中,super虽然代表了父类A的构造函数但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于A.prototype.constructor.call(this),super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类