一.了解nodeJs
1.什么是NodeJS
简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎(Google的Chrome浏览器使用的JavaScript执行环境),V8引擎执行Javascript的速度非常快,性能非常好。
2.为什么选择NodeJS
如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择。Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js。当然,如果你是后端程序员,想部署一些高性能的服务,那么学习Node.js也是一个非常好的选择。
3.nodeJS的特点
a. 它是一个Javascript运行环境b. 依赖于Chrome V8引擎进行代码解释
c. 事件驱动
d. 非阻塞I/O
e. 轻量、可伸缩,适于实时数据交互应用
f. 单进程,单线程
4.nodeJS的技术
A、nodejs.org看看nodejs的版本升级,新特性的加入,重要bug的修复等B、www.npmjs.com模块社区,看他人源代码,省力
C、github.com大量的项目和源码
D、stackoverflow.com技术解答社区以及查询相关资源,环境配置,异常均可找到答案
5.注意
nodejs的文档一定要和使用的版本保持相同,不同版本的接口或者其他方面甚至不同6.Node.js 创建第一个应用
a.创建beginning/server.js//1.引入 required 模块
var http = require('http');
//2.创建服务器
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8888);//监听请求
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
b.在cmd运行命令中找到项目:执行node server.js
c.打开浏览器:http://127.0.0.1:8888/
7.node.js和浏览器执行环境
相同点:都能执行一般的Js代码不同点:全局变量不同,例如window,document等只能在浏览器中取到,而process则只能在node环境中取到。
宿主:浏览器、node;
全局变量:浏览器-window、document;node - process;
二.简单的nodejs模块
1.模块的流程
创建模块( teacher.js)——》导出模块(exports.add=function(){.......})——》加载模块(var teacher=require('./teacher.js'))——》使用模块(teacher.add('Scott'))
2.简单的例子
一个班级里有老师和学生。创建school的文件
a.student.js
function add(student) {
console.log('添加学生:'+ student);
}
exports.add = add;
b.teacher.js
function add(teacher) {
console.log('添加老师:'+ teacher);
}
exports.add = add;
c.class.js
//使用模块前要使用 require 导入模块student
var student = require('./student')
var teacher = require('./teacher')
function add(teacherName,students) {
teacher.add(teacherName)
students.forEach(function(item,index){
student.add(item)
})
}
exports.add = add;
d.index.js 入口文件
//启动文件 入口文件
var Classs = require('./class')
Classs.add('刘老师',['小高','小林','小廖'])
![](https://i-blog.csdnimg.cn/blog_migrate/e9e37b84726a1d089ce299c095a0db90.png)
3.注意:
a.模块化:给每个对象新建一个单独的js,在里面对该对象属性方法进行定义,通过exports将该对象内部的方法属性暴露出来,使得其他对象能够访问,但是在访问之前必须在自身js中通过require引入该模块。
b.使用模块前要使用 require 导入模块
c.module.exports和export区别:
module.exports = add;特别的对象类型;(推荐使用,支持现有)
exports.add = add;传统的模块实例;(exports是辅助方法) 推荐使用
三.nodejs API
1.url
(1).URL基础知识点
.protocol:表示url采用的什么协议
.slashes:表示是否有斜线
.host:表示主机/IP地址 /域名
.post:端口(默认80端口不显示)
.hostname:主机名称
.hash:#后面的内容
.search:是查询字符串的参数
.pathname:获取及设置URL的路径(path)部分
(2).常用方法
a.url.parse 解析地址 在项目中特别好用
注意:url.parse(‘url‘,true):第二个参数为true, query被转换为了一个对象
b.url.format():将url对象格式化为url 字符串
url.format(url{protocol:'http'.........}) 输入上面那段url 就会得到一个url地址:http://www.baidu.com:8080/course/list?id=1002&name=xiaogao#floor_a1
c.url.resolve():用于解析,接受两个参数,拼接
2.querystring - 查询字符串
(1).querystring.stringfy(对象,连接符,键值对符号符号)->对象转换为对象字符串
该方法通过遍历给定的 obj 对象的自身属性,生成 URL 查询字符串
querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
// 返回 'foo=bar&baz=qux&baz=quux&corge='
querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':');
// 返回 'foo:bar;baz:qux'
(2).querystring.parse(对象字符串,需要转换的属性连接符,键值对符号)->对象字符串转换为对象
一个 URL 查询字符串 str 解析成一个键值对的集合
querystring.parse('foo=bar&abc=xyz&abc=123')
输出
{
foo: 'bar',
abc: ['xyz', '123']
}
(3).querystring.escape() 对给定的 str 进行 URL 编码该方法是提供给 querystring.stringify() 使用的,通常不直接使用。
(4).querystring.unescape('反转义字符串')->反转义字符串
对给定的 str 进行解码。该方法是提供给 querystring.parse() 使用的,通常不直接使用
3.http
http :就是一个协议
http客户端发送请求,创建端口——》http服务器在端口监听客服端请求——》http服务器向客服端返回状态和内容
a.http进阶概念
1. 什么是回调?
回调是异步编程最基本的方法,对nodejs来说要按顺序执行异步逻辑的时候,一般采取后续传递的方式
将后续逻辑封装成在回调函数中做起始函数的参数,逐层嵌套
2. 什么是同步/异步?
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
3. 什么是I/O?
磁盘的写入(in)
磁盘的读取(out)
4. 什么的单线程/多线程?
一次只能执行一个程序叫做单线程
一次能执行多个程序叫多线程
5. 什么是阻塞/非阻塞?
阻塞:前一个程序未执行完就得一直等待
非阻塞:前一个程序未执行完时可以挂起,继续执行其他程序,等到使用时再执行
6. 什么是事件?
一个触发动作(例如点击按钮)
7. 什么是事件驱动?
一个触发动作引起的操作(例如点击按钮后弹出一个对话框)
8. 什么是基于事件驱动的回调?
为了某个事件注册了回调函数,但是这个回调函数不是马上执行,只有当事件发生的时候,才会调用回调函数,这种函数执行的方式叫做事件驱动~这种注册回调就是基于事件驱动的回调,如果这些回调和异步I/O(数据写入、读取)操作有关,可以看作是基于回调的异步I/O,只不过这种回调在nodejs中是有事件来驱动的
9. 什么是事件循环?
//事件循环Eventloop,倘若有大量的异步操作,一些I/O的耗时操作,甚至是一些定时器控制的延时操作,它们完成的时候都要调用相应的回调函数,从而来完成一些密集的任务,而又不会阻塞整个程序执行的流程,此时需要一种机制来管理,这种机制叫做事件循环.
总而言之就是:管理大量异步操作的机制叫做事件循环
b.作用域和上下文
①作用域:与调用函数,访问变量的能力有关
作用域分为:局部和全局(在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量)
②上下文:与this关键字有关 是调用当前可执行代码的引用
this总是指向调用这个的方法的对象
js里的this通常是当前函数的拥有者,这个拥有者叫做执行上下文
//*this 在对象中,指向对象;在函数中,指向window/gloab ,在构造函数中,指向new后的对象。
var pet ={
words:'...',
speak:function () {
console.log(this) //输出是 pet
}
}
pet.speak();
function we(words){
this.words=words;
console.log(this)
}
we('...');//打印在浏览器的情况下是 window 在node环境下 global
function pets(words){
this.words=words;
this.speaks =function(){
console.log(this)
}
}
var cat =new pets('Miao');
cat.speaks();//this指向构造函数pets
//*call /apply都可以改变this的指向
var dog_pets ={
words:'...',
dog_speaks:function (say) {
console.log(say+' ' +this.words)
}
}
var dog = {
words:'Wang'
}
dog_pets.dog_speaks.call(dog,'speak');//speak Wang
三.例子
1.创建一个httpsever服务器
let http = require('http');
//4.加载url模块 :解析请求的头,地址
let url = require('url');
//5.
let util = require('util');
//2.创建Server
let server = http.createServer((req,res) =>{
//2.1.状态码:HTTP 状态值: 200 : OK
res.statusCode = 200;
//2.2设置服务器响应 响应的头 内容类型: text/plain
res.setHeader["content-type","text/plain;charset=utf-8"];
//4.1拿到浏览器访问url url.parse(req.url)
//5.1调试模式util.inspect() 是一个object对象
//2.3响应结束 输出
res.end(util.inspect(url.parse(req.url)));
})
//3.监听端口
server.listen(3000,'127.0.0.1', () =>{
console.log("服务器已经运行,请打开浏览器,输入:http://127.0.0.1:3000/ 来")
})
2.创建一个web服务器,可以访问到HTML内容
sever.js
//1.加载http模块 加载url模块 :解析请求的头,地址
let http = require('http');
let url = require('url');
let util = require('util');
/*
如何访问呢,就是通过fs读我们的文件
*/
//6 加载fs模块
let fs = require('fs');
//2.创建Server
let server = http.createServer((req,res) =>{
res.statusCode = 200;
res.setHeader["content-type","text/plain;charset=utf-8"];
//6.1
var pathName = url.parse(req.url).pathname;
//6.2 读取文件 注意:res.end();要放在读取文件中
fs.readFile(pathName.substring(1), (err, data) => {
if(err){
res.writeHead(404,{
'content-type':'text/html'
});
}else{
res.writeHead(200,{
'content-type':'text/html'
});
//6.3 获取内容写出来
res.write(data.toString());
}
res.end();
});
})
//3.监听端口
server.listen(3000,'127.0.0.1', () =>{
console.log("服务器已经运行,请打开浏览器,输入:http://127.0.0.1:3000/ 来")
})
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
</head>
<body>
hello,请访问
创建一个web容器,可以访问到HTML内容
</body>
</html>
![](https://i-blog.csdnimg.cn/blog_migrate/d306fb4d09e71b6c30be4373f923d59a.png)
3.通过http请求获取第三方服务
client.js
/*通过http请求获取第三方服务
//浏览器是客户端 node服务端(nodejs提供一种服务,是可以被人调用的,就是服务端)
比如有时候要去获取其他服务器上的数据,通过http模拟请求,获取第三方插件,此时nodejs就变成客服端
nodejs里面有客户端和服务端,nodejs提供一种被人调用的请求,这就变成服务端,如果是要调用第三方服务,此时nodejs的方式就变成客户端
*/
let http = require('http');
//3调试
let util = require('util');
//2.加载任意接口 第三方接口数据
http.get('http://www.imooc.com/u/card',function(res) {
let data = '';
//2.1监听: 接受接口数据
res.on("data",function (chunk){
data += chunk;
})
//2.2监听:什么时候接受完数据
res.on("end",function(){
let result = JSON.parse(data);
console.log("数据:"+util.inspect(result));
})
})