内容
-
Node.js介绍
- 是什么
- 特性
- 模块化
- 能做什么
- Node.js的一些学习资源
- 读取文件 -
fs
- 构建web服务器 -
http
一、Node.js介绍
1、Node.js是什么
-
Node.js是一个可以解析和执行JavaScript代码的JavaScript运行时环境
- Node.js不是一门语言
- 不是库,不是框架,是一个平台
- Node.js是一个JavaScript运行时环境
- 简单来说就是Node.js可以解析和执行JavaScript代码
- 也就是说现在的JavaScript可以完全脱离浏览器运行,一切归功于Node.js
-
构建于chrome V8之上
- 代码只是特性的字符串
- 引擎可以认识它,并解析和执行
- Google Chrome v8引擎是目前公认的解析和执行JavaScript最快的的引擎
- Node.js的作者把Google Chrome 的v8引擎移植出来,开发了一个独立的JavaScript运行时环境
-
浏览器中的JavaScript
- ECMAScript
- DOM
- BOM
-
Node.js中的JavaScript
- ECMAScript
- 没有DOM,BOM---服务端不操作DOM和BOM
-
Node.js为JavaScript提供了一些服务器级别操作的API
- 文件的读写
- 网络服务的构建
- 网络通信
- http服务器等处理
- 这些API核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识
- 我们通过require引入
var fs=require('fs')
-
Node.js的特性
- 事件驱动
- 非阻塞IO模型(异步)
- 轻量和高效
-
Node.js包生态系统-npm--世界上最大的开源库
- 绝大多数的JavaScript相关的包都保存在了npm上,这样让开发人员更方便的下载使用
-
Node模块化
-
模块有三种
- 具名模块:fs,http
-
用户自己编写的模块
- 使用 exports 导出,使用 require 导入
- Node没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部
- 相对路径用"./"
- 可以省略后缀名
-
2、Node.js能做什么
- WEB服务器后台
-
命令行工具
- git(C语言)
- npm(node开发的)
- hexo(node)
3、一些资源
-
《深入浅出Node.js》
- 阿里巴巴-朴灵编写
- 偏理论,基本没有实战内容
- 在有基础的基础上去看,对底层有帮助
-
《Node.js权威指南》
- API讲解
- JavaScript标准参考教程(alpha)
-
- 42页,闲暇时间可以看看
- 官方API文档
- 中文文档(比较旧,凑合看)
- CNODE社区
- CNODE社区新手入门
4、能学到什么
-
B/S编程模型
- Brower-Server
- back-end
- 服务器端语言都是B/S模型
-
模块化编程
- RequireJS
- SeaJS
- 以前认识的JavaScript只能通过<script>标签来加载
- 在node中可以像@import一样引入加载JavaScript脚本文件
- Node常用API
-
异步编程
- 回调函数
- Promise
- async
- generator
- Express第三方开发框架
- ES6
二、Hello World
- 创建编写JavaScript脚本文件
- 终端定位到对应目录
- node 文件名 执行对应的文件
注意:
- 文件不能使用node.js命名
- 尽量不使用中文命名
- Node中采用ECMAScript进行编码,没有DOM和BOM
三、文件的读写
fs: file system 文件系统。node的fs模块中包含所有文件操作相关的API
- 使用require方法加载 fs 核心模块
var fs=require('fs')
-
读文件
- 第一个参数就是要读取的文件路径
- 第二个参数是一个回调函数
-
成功
- data 数据
- error null
-
失败
- data undefined没有数据
- error 错误对象
fs.readFlie("要读取文件的路径",(err,data)=>{
if (error) {
console.log('读取文件失败了')
} else {
console.log(data.toString())
}
})
-
写文件
- 第一个参数:文件路径
- 第二个参数:文件内容
-
第三个参数:回调函数
- 回调函数有参数:error
-
成功:
- 文件写入成功
- error 是 null
-
失败:
- 文件写入失败
- error 就是错误对象
fs.writeFile('./data/你好.md', '大家好,给大家介绍一下,我是Node.js', function (error) {
if (error) {
console.log('写入失败')
} else {
console.log('写入成功了')
}
})
四 构建web服务器
4.1关于ip地址和端口号
- ip地址用来定位计算机
- 端口号用来定位具体的应用程序
- 一切需要联网通信的软件都会占用一个端口号
- 端口号范围 0-65536
- 最好不要去使用计算机的一些默认端口,例如http服务的80端口
4.2 http模块:创建编写服务器
1.加载http核心模块
var http = require('http');
2.使用http.createServer创建一个服务器实例
var server = http.createServer()
3.绑定端口号,启动服务器
server.listen(3000, function() {
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
})
- 执行此文件,就会打印'服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问'
- 浏览器访问http://127.0.0.1:3000/会打印'收到客户端的请求了''
4.服务器要干嘛?接受请求,发送响应数据
- 客户端访问服务器地址,发送访问请求
- 服务器端 注册 request 请求事件,接收请求,
-
执行第二个参数:回调处理函数(请求事件处理函数),并处理请求,发送响应
- request 请求事件处理函数,需要接收两个参数:
-
Request 请求对象 : 可以用来获取客户端的一些请求信息,例如请求路径
- 例如:request.url : 请求路径
-
Response 响应对象 : 可以用来给客户端发送响应消息
- response对象有一个方法:response.write(),可以用来给客户端发送响应数据
- write 可以使用多次,但是最后一定要使用 end方法来结束响应,否则客户端会一直等待
- 一般情况下,我们直接使用response.end("响应数据")
- 用例
server.on('request', function (request, response) {
console.log('收到客户端的请求了,请求路径是:' + request.url)
// response 对象有一个方法:write 可以用来给客户端发送响应数据
// write 可以使用多次,但是最后一定要使用 end 来结束响应,否则客户端会一直等待
response.write('hello')
response.write(' nodejs')
// 告诉客户端,我的话说完了,你可以呈递给用户了
response.end()
})
根据不同的url响应不同的内容
var http = require('http')
// 1. 创建 Server
var server = http.createServer()
// 2. 监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
var url = req.url
if (url === '/') {
res.end('index page')
} else if (url === '/login') {
res.end('login page')
} else if (url === '/products') {
var products = [{
name: '苹果 X',
price: 8888
},
{
name: '菠萝 X',
price: 5000
},
{
name: '小辣椒 X',
price: 1999
}
]
// 响应内容只能是二进制数据或者字符串
// 数字
// 对象
// 数组
// 布尔值
res.end(JSON.stringify(products))
} else {
res.end('404 Not Found.')
}
})
// 3. 绑定端口号,启动服务
server.listen(3000, function () {
console.log('服务器启动成功,可以访问了。。。')
})
4.3. content-type---浏览器响应内容类型及编码
- 不同的类型对应不同的content-type
- 查找工具: http://tool.oschina.net/commons
-
图片不需要指定编码格式,一般为字符串指定编码格式
res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.setHeader('Content-Type', 'text/html; charset=utf-8') res.setHeader('Content-Type', 'image/jpeg')
- 服务器默认发送数据的格式是utf-8模式 - 浏览器默认操作系统的编码:中文编码:gbk - 在 http 协议中,Content-T就是用来告知对方我给你发送的数据内容是什么类型 - text/plain 普通文本,如果是html格式的,用text/html
4.4. fs
模块和http
模块组合使用读取不同的内容
var http = require('http')
var fs = require('fs')
var server = http.createServer()
server.on('request', function (req, res) {
// / index.html
var url = req.url
if (url === '/') {
// 我们要发送的还是在文件中的内容
fs.readFile('./resource/index.html', function (err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('文件读取失败,请稍后重试!')
} else {
// data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
// res.end() 支持两种数据类型,一种是二进制,一种是字符串
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(data)
}
})
} else if (url === '/xiaoming') {
// url:统一资源定位符
// 一个 url 最终其实是要对应到一个资源的
fs.readFile('./resource/ab2.jpg', function (err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('文件读取失败,请稍后重试!')
} else {
// data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
// res.end() 支持两种数据类型,一种是二进制,一种是字符串
// 图片就不需要指定编码了,因为我们常说的编码一般指的是:字符编码
res.setHeader('Content-Type', 'image/jpeg')
res.end(data)
}
})
}
})
server.listen(3000, function () {
console.log('Server is running...')
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。