node

241 阅读10分钟

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')
  • 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

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
  • 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 数据库
    • 这个确实和强大,但是比较原始,麻烦,所以咱们不使用它
  • mongoose
    • 真正在公司进行开发,使用的是 mongoose 这个第三方包
    • 它是基于 MongoDB 官方的 mongodb 包进一步做了封装
    • 可以提高开发效率
    • 让你操作 MongoDB 数据库更方便
  • 掌握使用 mongoose 对数据集合进行基本的 CRUD
  • 把之前的 crud 案例改为了 MongoDB 数据库版本
  • 使用 Node 操作 mysql 数据库

安装

启动和关闭数据库

启动:

# 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包来操作

​ mongodb.github.io/node-mongod…

使用第三方包mongoose来操作MongoDB数据库

​ 第三方包:mongoose基于MongoDB官方的mongodb包再一次做了封装,名字叫mongoose,是WordPress项目团队开发的。

​ mongoosejs.com/