什么是Node.js?
概要
Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。
Node.js 的包管理器 npm,是全球最大的开源库生态系统。
官方网站
使用版本
- 10.16.0 LTS
基础知识
- Javascript/ES2015(ES6)
- Unix/Linux(Ubuntu)
开发工具
记事本等文本编辑器
- Visual Studio Code(推荐)
- Brackets
- ATOM
浏览器
- Google Chrome(推荐)
- FireFox
- IE/edge
线程模型和事件循环
知识点
- 线程模型
- 事件循环
线程模型
Apache+Tomcat(6,7,8,9)运行
- req来袭
- thread应对
- req处理完后,thread释放
线程处理模式就是重复以上三个步骤,来处理来自客户端的各种请求,当有大量客户端的请求来袭时,服务器消耗的资源也会随之增加。
事件循环
Node.js服务运行
- 开一个事件等待循环(event-loop)
- req来袭
- 放入事件处理队列中,然后继续等待新的req请求
- req处理完成后,调用I/O,结束req(非阻塞调用)
事件循环处理模式中,线程不用等待req处理完后在进行下个req的处理,而是将所有的req请求放入到队列之中,然后采用非同步的方式,等待req处理完后再调用I/O资源,然后结束req。
从HelloWorld开始
知识点
- Node.js控制台
- javascript文件
实战演习
Node.js控制台
1 | C:\Users\sandu |
javascript文件
创建一个heloworld.js文件,内容如下:
1 | console.log('hello world!'); |
使用node.js执行该js文件:
1 | D:\node_test |
非阻塞处理
知识点
- 阻塞处理(Java,Ruby,PHP,Asp.Net)
- 非阻塞处理(Node.js)
实战演习
1 | //////////////////// |
简单的Web服务器
知识点
- http内置模块
参照文档:
https://nodejs.org/en/about/
实战演习
1 | const http = require('http'); |
引用外部js文件
知识点
- require:引用外部js文件
实战演习
config.js
1 | const config = { |
myserver.js
1 | const http = require('http'); |
URL为我指引方向
知识点
- req.url:返回客户端请求的url地址
实战演习
1 | const http = require('http'); |
你写我读HTML
知识点
- fs文件读写模块的引用
实战演习
index.html
1 | <html> |
myserver.js
1 | const http = require('http'); |
npm包管理器
知识点
- npm的使用方法
- ejs的安装
npm是Node.js附带的第三方软件包管理器,可以为Node.js提供更多的功能支持。
npm官网
ejs(Effective JavaScript templating)
实战演习
1 | D:\node_test |
hello.ejs
1 | <html> |
ejs能写网页?
知识点
- ejs的使用
实战演习
hello.ejs
1 | <html> |
myserver.js
1 | const http = require('http'); |
做个小论坛
知识点
- 做一个含有表单的论坛网页
实战演习
forum.ejs
1 |
|
表单的处理
知识点
- 服务器表单的处理
实战演习
myserver.js
1 | const http = require('http'); |
连接MongoDB
知识点
- mongodb驱动安装
- node.js连接MongoDB
实战演习
mongodb驱动安装
官方网站:
http://mongodb.github.io/node-mongodb-native/
1 | $ npm install mongodb --save |
PS:Mongoose也是一个非常不错的MongoDB存取API,也推荐给您。
node.js操作MongoDB
mongofunc.js
1 | const MongoClient = require('mongodb').MongoClient; |
插入MongoDB文档
知识点
- node.js操作MongoDB
实战演习
mongofunc.js
1 | const MongoClient = require('mongodb').MongoClient; |
读出MongoDB文档
知识点
- node.js读取MongoDB
实战演习
mongofunc.js
1 | const MongoClient = require('mongodb').MongoClient; |
Node.js回调地狱
知识点
- Node.js回调地狱
- Promise承诺解决
回调地狱
Node.js是非阻塞编程,那么在编码过程中会遇到很多的回调函数(Callback),如果多个处理的回调函数嵌套在一起的话,就会形成回调地狱,虽然对于程序的结果没有任何影响,但对于程序代码的可读性来说就是个地狱。
1 | //回调地狱 |
Promise解决
1 | // Promise函数嵌套解决方法 |
Promise解决回掉地狱
知识点
- Promise承诺解决
实际演示一下回掉地狱,以及如何解决回掉地狱
1 | // updb1.js演示一下回掉地狱 |
1 | // updb2.js解决回掉地狱 |