Node.js 第1天
1.总结
- Node.js 是什么
- JavaScript 运行时
- 既不是语言,也不是框架,它是一个平台
- Node.js 中的 JavaScript
- 没有 BOM、DOM
- EcmaScript 基本的 JavaScript 语言部分
- 在 Node 中为 JavaScript 提供了一些服务器级别的 API
- 文件操作的能力
- http 服务的能力
2.总结
-
Node 中的 JavaScript
- EcmaScript
- 变量
- 方法
- 数据类型
- 内置对象
- Array
- Object
- Date
- Math
- 模块系统
- 在 Node 中没有全局作用域的概念
- 在 Node 中,只能通过 require 方法来加载执行多个 JavaScript 脚本文件
- require 加载只能是执行其中的代码,文件与文件之间由于是模块作用域,所以不会有污染的问题
- 模块完全是封闭的
- 外部无法访问内部
- 内部也无法访问外部
- 模块作用域固然带来了一些好处,可以加载执行多个文件,可以完全避免变量命名冲突污染的问题
- 但是某些情况下,模块与模块是需要进行通信的
- 在每个模块中,都提供了一个对象:
exports
- 该对象默认是一个空对象
- 你要做的就是把需要被外部访问使用的成员手动的挂载到
exports
接口对象中 - 然后谁来
require
这个模块,谁就可以得到模块内部的exports
接口对象 - 还有其它的一些规则,具体后面讲,以及如何在项目中去使用这种编程方式,会通过后面的案例来处理
- 核心模块
- 核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识,例如
- fs 文件操作模块
- http 网络服务构建模块
- os 操作系统信息模块
- path 路径处理模块
- 。。。。
- 所有核心模块在使用的时候都必须手动的先使用
require
方法来加载,然后才可以使用,例如:var fs = require('fs')
- 核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识,例如
- EcmaScript
-
http
- require
- 端口号
- ip 地址定位计算机
- 端口号定位具体的应用程序
- Content-Type
- 服务器最好把每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉
- 不同的资源对应的 Content-Type 是不一样,具体参照:tool.oschina.net/commons
- 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
- 通过网络发送文件
- 发送的并不是文件,本质上来讲发送是文件的内容
- 当浏览器收到服务器响应内容之后,就会根据你的 Content-Type 进行对应的解析处理
-
模块系统
-
Node 中的其它的核心模块
-
做一个小管理系统:
- CRUD
-
Express Web 开发框架
npm install express
Node.js 第2天
代码风格
var foo = 'bar'
var foo ='bar'
var foo= 'bar'
var foo = "bar"
if (true) {
console.log('hello')
}
if (true) {
console.log('hello')
}
if (true ){
console.log('hello')
}
为了约定大家的代码风格,所以在社区中诞生了一些比较规范的代码风格规范:dnsajkndkjsabnjkdnjksandjknsajkdnjkasnjkdnjksandjknsajkdnjksajkdnas
- JavaScript Standard Style
- Airbnb JavaScript Style
1.总结
-
代码风格
-
无分号
(
[
- `
- 最好前面补分号,避免一些问题
- 《编写可维护的 JavaScript》
- 不仅是功能,还要写的漂亮
-
服务端渲染
- 说白了就是在服务端使用模板引擎
- 模板引擎最早诞生于服务端,后来才发展到了前端
-
服务端渲染和客户端渲染的区别
- 客户端渲染不利于 SEO 搜索引擎优化
- 服务端渲染是可以被爬虫抓取到的,客户端异步渲染是很难被爬虫抓取到的
- 所以你会发现真正的网站既不是纯异步也不是纯服务端渲染出来的
- 而是两者结合来做的
- 例如京东的商品列表就采用的是服务端渲染,目的了为了 SEO 搜索引擎优化
- 而它的商品评论列表为了用户体验,而且也不需要 SEO 优化,所以采用是客户端渲染
Node.js 第3天
1.总结
- 客户端渲染和服务端渲染的区别
- 最少两次请求,发起 ajax 在客户端使用模板引擎渲染
- 客户端拿到的就是服务端已经渲染好的
- 掌握如何解析请求路径中的查询字符串
- url.parse()
- 如何在 Node 中实现服务器重定向
- header('location')
- 301 永久重定向 浏览器会记住
- a.com b.com
- a 浏览器不会请求 a 了
- 直接去跳到 b 了
- 302 临时重定向 浏览器不记忆
- a.com b.com
- a.com 还会请求 a
- a 告诉浏览器你往 b
- 301 永久重定向 浏览器会记住
- header('location')
- exports 和 module.exports 的区别
- exports 只是 module.exports 的一个引用而已,目的只是为了简化写法
- 每个模块最终 return 的是 module.exports
- require 方法加载规则
- 优先从缓存加载
- 核心模块
- 路径形式的模块
./xxx
../xxxx
/xxxx
/ 在这里表示的是磁盘根路径c:/xxx
- 第三方模块
- 第三方模块的标识就是第三方模块的名称(不可能有第三方模块和核心模块的名字一致)
- npm
- 开发人员可以把写好的框架、库发布到 npm 上
- 使用者在使用的时候就可以很方便的通过 npm 来下载
- 使用方式:
var 名字 = require('npm install 的那个包名')
- node_modules
- node_modules/express
- node_modules/express/package.json
- node_modules/express/package.json main
- 如果 package.json 或者 package.json main 不成立,则查找备选项:index.js
- 如果以上条件都不成立,则继续进入上一级目录中的 node_modules 按照上面的规则继续查找
- 如果直到当前文件模块所属磁盘根目录都找不到,最后报错:
can not find module xxx
- package.json 包描述文件
- 就是产品的说明书
dependencies
属性,用来保存项目的第三方包依赖项信息- 所以建议每个项目都要有且只有一个 package.json (存放在项目的根目录)
- 我们可以通过
npm init [--yes]
来生成 package.json 文件 - 同样的,为了保存依赖项信息,我们每次安装第三方包的时候都要加上:
--save
选项。
- npm 常用命令
- install
- uninstall
- npm init(生成package.json说明书文件)
- npm init -y(可以跳过向导,快速生成)
- npm help
- 查看使用帮助
- npm 命令 --help
- 查看具体命令的使用帮助(npm uninstall --help)
2.总结
npm config set registry https://npm.taobao.org;
#查看npm配置信息
npm config list;
Node.js 第4天
1.总结
模块标识符中的/
和文件操作路径中的/
文件操作路径:
// 咱们所使用的所有文件操作的API都是异步的
// 就像ajax请求一样
// 读取文件
// 文件操作中 ./ 相当于当前模块所处磁盘根目录
// ./index.txt 相对于当前目录
// /index.txt 相对于当前目录
// /index.txt 绝对路径,当前文件模块所处根目录
// d:express/index.txt 绝对路径
fs.readFile('./index.txt',function(err,data){
if(err){
return console.log('读取失败');
}
console.log(data.toString());
})
模块操作路径:
// 在模块加载中,相对路径中的./不能省略
// 这里省略了.也是磁盘根目录
require('./index')('hello')
package.json和package-lock.json
npm 5以前是不会有`package-lock.json`这个文件
npm5以后才加入这个文件
当你安装包的时候,npm都会生成或者更新`package-lock.json`这个文件
-
npm5以后的版本安装都不要加
--save
参数,它会自动保存依赖信息- 当你安装包的时候,会自动创建或者更新
package-lock.json
文件 package-lock.json
这个文件会包含node_modules
中所有包的信息(版本,下载地址。。。)- 这样的话重新
npm install
的时候速度就可以提升
- 当你安装包的时候,会自动创建或者更新
-
从文件来看,有一个
lock
称之为锁- 这个
lock
使用来锁版本的 - 如果项目依赖了
1.1.1
版本 - 如果你重新install其实会下载最新版本,而不是
1.1.1
package-lock.json
的另外一个作用就是锁定版本号,防止自动升级- ^1.1.1 ^代表最高可升级到1.12.4 1的最新版本
- 这个
Express
原生的http在某些方面表现不足以应对我们的开发需求,所以就需要使用框架来加快我们的开发效率,框架的目的就是提高效率,让我们的代码高度统一。
在node中有很多web开发框架。主要学习express
-
http://expressjs.com/
,其中主要封装的是http。 -
// 1 安装 // 2 引包 var express = require('express'); // 3 创建服务器应用程序 // 也就是原来的http.createServer(); var app = express(); // 公开指定目录 // 只要通过这样做了,就可以通过/public/xx的方式来访问public目录中的所有资源 // 在Express中开放资源就是一个API的事 app.use('/public/',express.static('/public/')); 也可以起别名app.use('/bieming/',express.static('/public/')); 也可以省略app.use(express.static('/public/')); //模板引擎在Express中开放模板也是一个API的事 // 当服务器收到get请求 / 的时候,执行回调处理函数 app.get('/',function(req,res){ res.send('hello express'); }) // 相当于server.listen app.listen(3000,function(){ console.log('app is runing at port 3000'); })
-
get:
//当你以get方法请求/的时候,执行对应的处理函数 app.get('/',function(req,res){ res.send('hello world'); })
-
post:
//当你以post方法请求/的时候,执行对应的处理函数 app.post('/',function(req,res){ res.send('hello world'); })
修改完代码自动重启
我们在这里可以使用一个第三方命名行工具:`nodemon`来帮助我们解决频繁修改代码重启服务器的问题。
`nodemon`是一个基于Node.js开发的一个第三方命令行工具,我们使用的时候需要独立安装:
#在任意目录执行该命令都可以
#也就是说,所有需要 --global安装的包都可以在任意目录执行
npm install --global nodemon
npm install -g nodemon
#如果安装不成功的话,可以使用cnpm安装
cnpm install -g nodemon
安装完毕之后使用:
node app.js
#使用nodemon
nodemon app.js
只要是通过`nodemon`启动的服务,则他会监视你的文件变化,当文件发生变化的时候,会自动帮你重启服务器。
Node.js 第5天
- 回调函数
- 异步编程
- 如果需要得到一个函数内部异步操作的结果,这是时候必须通过回调函数来获取
- 在调用的位置传递一个函数进来
- 在封装的函数内部调用传递进来的函数
- find、findIndex、forEach
- 数组的遍历方法,都是对函数作为参数一种运用
- every
- some
- includes
- map
- reduce
- 数组的遍历方法,都是对函数作为参数一种运用
- package-lock.json 文件的作用
- 下载速度快了
- 锁定版本
- JavaScript 模块化
- Node 中的 CommonJS
- 浏览器中的
- AMD require.js
- CMD sea.js
- EcmaScript 官方在 EcmaScript 6 中增加了官方支持
- EcmaScript 6
- 后面我们会学,编译工具
- MongoDB 数据库
- MongoDB 的数据存储结构
- 数据库
- 集合(表)
- 文档(表记录)
- MongoDB 的数据存储结构
- MongoDB 官方有一个 mongodb 的包可以用来操作 MongoDB 数据库
- 这个确实和强大,但是比较原始,麻烦,所以咱们不使用它
- mongoose
- 真正在公司进行开发,使用的是 mongoose 这个第三方包
- 它是基于 MongoDB 官方的 mongodb 包进一步做了封装
- 可以提高开发效率
- 让你操作 MongoDB 数据库更方便
- 掌握使用 mongoose 对数据集合进行基本的 CRUD
- 把之前的 crud 案例改为了 MongoDB 数据库版本
- 使用 Node 操作 mysql 数据库
安装
-
下载
-
安装
npm i mongoose
-
配置环境变量
-
最后输入
mongod --version
测试是否安装成功
启动和关闭数据库
启动:
# mongodb 默认使用执行mongod 命令所处盼复根目录下的/data/db作为自己的数据存储目录
# 所以在第一次执行该命令之前先自己手动新建一个 /data/db
mongod
如果想要修改默认的数据存储目录,可以:
mongod --dbpath = 数据存储目录路径
停止:
在开启服务的控制台,直接Ctrl+C;
或者直接关闭开启服务的控制台。
连接数据库
连接:
# 该命令默认连接本机的 MongoDB 服务
mongo
退出:
# 在连接状态输入 exit 退出连接
exit
基本命令
-
show dbs
- 查看数据库列表(数据库中的所有数据库)
-
db
- 查看当前连接的数据库
-
use 数据库名称
- 切换到指定的数据库,(如果没有会新建)
-
show collections
- 查看当前目录下的所有数据表
-
db.表名.find()
- 查看表中的详细信息
在Node中如何操作MongoDB数据库
使用官方的MongoDB
包来操作
使用第三方包mongoose
来操作MongoDB数据库
第三方包:mongoose
基于MongoDB官方的mongodb
包再一次做了封装,名字叫mongoose
,是WordPress项目团队开发的。