点击通往->黑马node.js视频.
黑马node.js笔记 & 目录:
第一章 Node开发概述
一、服务器端开发要做的事情
1、实现网站的业务逻辑
2、数据的增删改查
二、为什么选择Node
1、使用js语法开发后端应用
2、生态系统活跃,有大量开源库可以使用
3、前端开发工具大多基于Node开发
三、Node是什么
Node是一个基于Chrome V8引擎的js代码运行环境
运行环境:
- 浏览器(软件)能够运行js代码,浏览器就是js代码的运行环境
- Node(软件)能够运行js代码,Node就是js代码的运行环境
四、Node运行环境搭建
五、Node.js快速入门
1、node.js组成
node.js由两部分组成:ECMAScript(基础语法)+Node模块API
2、Node.js全局对象global
第二章 模块化开发
一、node.js模块化开发
1、js开发的弊端
js在使用时存在两大问题,文件依赖和命题冲突
2、Node.js中模块化开发规范
- node规定一个js文件就是一个模块,模块内部定义变量和函数默认情况下在外部无法得到
- 模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块
使用exports对象进行成员导出:
//a.js
//在模块内部定义变量
let version = 1.0;
//在模块内部定义方法
const sayHi = name => `您好,${
name}`;
//向模块外部导出数据
exports.version = version;
exports.sayHi = sayHi;
使用require方法导入其他模块:
//b.js
//在b.js模块中导入模块a
let a = require('./a.js');
//输出a模块中的version变量
console.log(a.version);
//调用a模块中的sayHi方法并输出其返回值
console.log(a.sayHi('xiaoyang'));
3、导出的另一种方式
二、系统模块
1、什么是系统模块
node运行环境提供的API。因为这些API都是以模块化的方式进行开发的,所以我们又称为node运行环境提供的API为系统模块
2、fs文件操作
引入fs模块
const fs = require('fs');
- 读取文件内容
- 写入文件内容
3、path路径操作
(1)为什么要进行路径拼接
- 不同操作系统的路径分隔符不统一
(2)路径拼接语法
//语法
path.join('路径一','路径二',...)
三、第三方模块
1、什么是第三方模块
别人写好的、具有特定功能的、我们可以直接使用的模块即第三方模块,由于通常是由多个文件组成并且被放置在一个文件夹中,所以又名为包
第三方模块有两种存在形式:
- 以js文件形式存在,提供实现项目具体功能的API接口
- 以命令行工具形式存在,辅助项目开发
2、如何获取第三方模块
npmjs.com:第三方模块的存储和分发仓库
- 下载:在命令行输入 npm install 模块名称
- 卸载:在命令行输入 npm uninstall 模块名称
全局安装与本地安装
- 命令行工具:全局安装
- 库文件:本地安装
3、第三方模块nodemon
nodemon是一个命令行工具,用于辅助开发
在Node.js,每次修改文件都要在命令行工具重新执行 改文件,非常繁琐
使用步骤:
4、第三方模块nrm
nrm:npm下载地址切换工具(镜像下载,npmjs.com国外网站)
使用步骤:
5、第三方模块Gulp
基于node 平台开发的前端构建工具
将机械化操作编写成任务,想要执行机械化操作时执行一个命令行命令就能自动执行了,用机器代替手工,提高开发效率
(1)Gulp能做什么
(2)使用
(3)gulp提供的方法
(4)gulp插件
四、node_modules文件夹
1、node_modules文件夹的问题
- 文件夹过多过碎,当我们整体拷贝给别人的时候,传输会很慢
- 复杂的模块依赖关系需要被记录,确保模块的版本和当前一致,否则会导致当前项目运行报错
2、package.json文件的作用
项目描述文件,记录了当前项目的信息,例如项目名称、版本、作者、github地址,当前项目依赖了哪些第三方模块等等,使用npm init -y命令生成
3、项目依赖
在项目的开发阶段和线上运行阶段,都需要依赖的第三方包,称为项目依赖
使用npm install 包命令下载的文件会默认被添加到package.json文件的dependencies字段中
五、node.js中模块的加载机制
1、模块查找规则-当模块拥有路径但没有后缀时
2、模块查找规则-当模块没有路径且没有后缀时
第三章、服务器端基础
一、创建web服务器
1、创建web服务器
//引用系统模块http
const http = require('http');
//创建web服务器
const app = http.createServer();
//当客户端发送请求的时候
app.on('request',(req,res)=>{
//响应
res.end('<h1>hi,user</h1>');
});
app.listen(3000);
console.log('网站服务器启动成功');
二、http协议
1、http协议的概念
超文本传输协议(http)规定了如何从网站服务器传输超文本到本地浏览器,它基于客户端服务器架构工作,是客户端和服务器端请求和应答的标准
2、报文
在http请求和响应的过程中传递的数据块就叫报文,包括要传送的数据和一些附加信息,并且要遵守规定好的格式
3、请求报文
(1)请求方式
- GET 请求数据
- POST 发送数据(相对于GET安全一点)
(2)请求地址(RequestURL)
4、响应报文
(1)http状态码
- 200请求成功
- 404请求的资源没有找到
- 500服务器端错误
- 400客户端请求语法错误
(2)内容类型
- text/html
- text/css
- application/javascript
- inage/jpag
- application/json
三、HTTP请求与响应处理
1、请求参数
客户端向服务器端发送请求时,有时候需要携带一些客户信息,客户信息需要通过请求参数的形式传递到服务器端,比如登录操作。
2、GET请求参数
参数被放置在浏览器地址栏中。
3、POST请求参数
- 参数被放置在请求体中进行传输
- 获取POST参数需要使用data事件和end事件
- 使用querystring系统模块将参数转换为对象格式
4、路由
路由是指客户端请求地址与服务器端程序代码的对应关系,即请求什么就响应什么
核心代码:
5、静态资源
服务器端不需要处理的,可以直接响应给客户端的资源就是静态资源,例如css、js、image文件
6、动态资源
相同的请求地址不同的响应资源
四、Node.js的工作原理
1、同步API,异步API
-
同步API:只有当前执行完成后,才能执行下一步API
-
异步API:当前API的执行不会阻塞后续代码的执行
2、同步API和异步API区别
- 返回值, 同步API可以从返回值中拿到API执行的结果,但是异步API是不可以的(默认返回undefined)
- 代码执行顺序
3、回调函数
自定义函数让别人去调用
4、node.js中的异步API
5、Promise
Promise出现的目的是解决node.js异步编程中回调地狱的问题
let promise = new Promise((resolve,reject) =>{
setTimeout(() =>{
if(true){
resolve({
name:'张三'})
}else{
reject('失败了')
}
},2000);
});
promise.then(result => console.log(result);)
.catch(error =>console.log(error);)
6、异步函数
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了
第四章 数据库基础
一、数据库概述及环境搭建
1、什么是数据库
数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。它是独立于语言之外的软件,可以通过API去操作它。
2、MongoDB数据库的下载安装
点击通往下载安装MongoDB->MongoDB.
3、数据库相关概念
在一个数据库软件中可以包含多个数据库,在每一个数据库仓库中可以包含多个数据集合,每个数据集合可以包含多条文档(具体数据)。
术语 | 解释说明 |
---|---|
database | 数据库,mongoDB数据库软件中可以建立多个数据库 |
collection | 集合,一组数据的集合,可以理解为javascript中的数组 |
document | 文档,一条具体的数据,可以理解为JavaScript中的对象 |
field | 字段,文档中的属性名称,可以理解为JavaScript中的对象属性 |
4、Mongoose第三方包
使用node.js操作MongoDB数据库需要依赖的node.js第三方包mongoose
使用npm install mongoose命令下载
5、启动mongodb
在命令行工具(管理员身份)运行net start mongodb即可以mongodb,否则mongodb无法连接
6、数据库连接
使用mongoose提供connect方法即可以连接数据库
//引入
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground')
.then(()=>console.log('数据库连接成功'))
.catch(err=>console.log('数据库连接失败',err));
7、创建数据库
在mongodb中不需要显示的创建数据库,如果正在使用的数据库不存在,mongodb会自动创建
二、mongodb增删改查操作
1、创建集合(collection)
创建集合分为两步
- 一是对集合设定规则
- 二是创建集合,
创建mongoose.Schema构造函数的实例即可创建集合
语法如下:
//设定集合规则,用Schema
const courseSchema = new mongoose.Schema({
name:String,
author:String,
isPublished:Boolean
});
//创建集合并应用规则
//用mongoose.model创建集合实例,集合名首字母要大写
//这里虽然取得名字是Course,但在数据库中是courses
const Course = mongoose.model('Course',courseSchema);
2、创建文档(document)
创建文档实际上就是向集合中插入数据
方法一:
分为两步:
- 创建集合实例,即创建文档
- 调用实例对象下的save方法将数据库保存到数据库中
语法如下:
//创建集合实例
const course = new Course({
name: 'node.js',
author: 'hm',
isPublished: true
})
// 调用实例对象下的save方法将数据库保存到数据库中
course.save();
方法二:
用create方法
Course.create({
name: 'es6', author: 'pink', isPublished: false }, (err, result) => {
console.log(err);
console.log(result);
})
和数据库相关的操作都是异步操作
create方法也返回promise对象,所以也可以这样写:
Course.create({
name: 'es6', author: 'pink', isPublished: false })
.then(doc=>console.log(doc))
.catch(err=>console.log(err))
3、查询文档
①要查询文档就首先要有足够的数据,所以要先导入数据,语法如下:
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
②查询文档
(1)通过find()方法查询
//根据条件查找文档
//find()中语句为空则查找所有文档
Course.find().then(result => console.log(result));
//返回文档集合
当find()中为空时:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground')
.then(() => console.log('数据库连接成功'))
.catch(err => console.log('数据库连接失败', err));
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublished: Boolean
});
const Course = mongoose.model('Course', courseSchema);
Course.find().then(result => console.log(result));
执行后结果为:
将find()中加一个条件{ _id: ‘615aef0b3afad93afa05a9a9’ }:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground')
.then(() => console.log('数据库连接成功'))
.catch(err => console.log('数据库连接失败', err));
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublished: Boolean
});
const Course = mongoose.model