七天搞定node.js---第一天

最近在学习node.js,记录一下自己的学习过程和一些笔记。

node.js介绍

为什么要学习node.js

  • 企业需求
    • 具有服务端开发经验更好
    • font-end
    • back-end
    • 全栈开发工程师
      • 全干
    • 基本的网络开发能力
      • 服务端
      • 前端
      • 运维部署
    • 多人社区
  • node.js是什么
    • JavaScript 运行时
    • 既不是语言,也不是框架,它是一个平台
  • node.js 中的 JavaScript
    • 没有BOM、DOM
    • EcmaScript基本的JavaScript
    • 在 node 中为 JavaScript 提供了一些服务器级别的 API
      • 文件操作的能力
      • http 服务的能力
  • 模块系统
    • 在 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 进行对应的解析处理

起步

还是 node 环境的安装

  • 查看当前 node 环境的版本号
  • 下载 https://nodejs.org/en/download/
  • 安装
    • 傻瓜式的一路next就好了
    • 对于已经安装过的,重新安装就会升级
  • 确认 node 环境是否安装成功
    • 打开命令行,输入node --version
    • 或者node -v查看版本号
  • 环境变量

Hello World

解析执行 JavaScript

1.创建编写 JavaScript 脚本文件
2.打开终端,定位到脚本文件所属目录
3.输入node 文件名执行对应文件
注意:文件不要使用node.js来命名,也就是说除了 node 这个名字其他随便取(不要太过分~),而且最好也不要使用中文。

文件的读写

文件读取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var file_system = require('fs')
// 读取文件有2参数
// 第一个参数是文件地址
// 第二个参数是一个回调函数:
// 成功:
// data是数据
// error是null
// 失败:
// data是undefind
// error是错误对象

file_system.readFile('./doc.txt', function(error, data) {
//<Buffer e5 ad a6 e4 b9 a0 6e 6f 64 65 2e 6a 73 e7 9a 84 e7 ac ac e4 b8 80 e5 a4 a9 e3 80 82> 储存的是二进制数据
// 二进制转换为16进制了,所以看到的不是 0 1
// 用tostring方法转换为我们可以阅读的字体
// console.log(error)
// console.log(data)
// console.log(data.toString())
//这里就可以通过判断 error 来确认是否有错误发生
if(error){
console.log('文件读取失败~')
}else{
console.log(data.toString())
}
})

文件写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var fs = request('fs')
//$.ajax({
// ...
// success:function (data){

// }
//})

//第一个参数:文件路径
//第二个参数:文件内容
//第三个参数:回调函数
// error
//
// 成功:
// 文件写入成功
// error 是 null
// 失败:
// 文件写入失败
// error 就是错误对象
fs.writeFile('./data/你好.md/(text)','大家好,给大家介绍一下,我是Node.js',function(error){
// console.log('文件写入成功')
// console.log(error)
if(error){
console.log('写入失败')
}else{
console.log('写入成功')
}
})

http

一个很傻的服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 你可以使用 node 非常轻松的构建一个 web 服务器
// 在 node 中专门提供了一个核心模块:http
// http 这个模块的职责就是帮助你创建缩写服务器的

//1、加载 http 核心模块
var http = require('http')

//2、使用 http.createServer() 方法创建一个 web 服务器
// 返回一个 Server 实例
var server = http.createServer()


//3、服务器要干什么?
// 提供服务:对数据的服务
// 发请求
// 接收请求
// 处理请求
// 给个反馈(发送响应)
// 注册 request 请求事件
// 当客户端发送请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
//

server.on('request',function(){
console.log('收到客户端的请求了')
})

//4、绑定端口号,启动服务器
server.listen(3000,function(){
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问 ')
})

http

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
var http = require('http')

//1、创建Server
var server = http.createServer()
//2、createServer (http-res-url.js)请求处理函数
server.on('request', function(req, res) {
// console.log('收到请求了,请求路径是:' + req.url)
// res.write('hello')
// res.write('world')
// res.end()

//上面的方式比较麻烦,推荐使用更简洁的方式,直接end的同时发送响应数据。
// res.end('hello nodejs')

//根据不同的请求路径发送不同的响应结果
// 1、获取请求路径
// req.url 获取的是端口号之后的那一部分路径
// 也就是说所有的 url 都是以 / 开头的
// 2、判断路径处理响应

var url = req.url
// if (url === '/') {
// res.end('index page')
// } else if (url === '/login') {
// res.end('login page')
// } else {
// res.end('404 Not Found')
// }

//学会了这些就能写简单版的接口了,例如:
if (url === '/products') {
var products = [{
name: 'iphone X',
price: 8888
}, {
name: '华为',
price: 6000
}, {
name: '小米',
price: 3000
}, {
name: '魅族',
price: 2500
}, {
name: '1+',
price: 3500
}, ]
//响应内容只能是二进制数据或者字符串
//数字、对象、数组、布尔值通通无效

//数组转字符串 JSON.stringify()
res.end(JSON.stringify(products))
}
})
//3、绑定端口号,启动服务
server.listen(3000, function() {
console.log('服务器启动成功,可以正常访问了~~')
})

http
简单写个API接口

解决编码问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var http = require('http')

var server = http.createServer()
server.on('request', function(req, res) {
//在服务端默认发送的数据,其实是 utf8 编码的内容
//但是浏览器不知道你是 utf8 编码内容
//浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
//中文操作系统默认编码是 gdk
//解决方法就是正确的告诉浏览器我给你发送的内容是什么编码的
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('你好,世界')
})
server.listen(3000, function() {
console.log('Server is running...')
})

解决编码问题

Content-Type类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var http = require('http')

var server = http.createServer()
server.on('request', function(req, res) {
//在服务端默认发送的数据,其实是 utf8 编码的内容
//但是浏览器不知道你是 utf8 编码内容
//浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
//中文操作系统默认编码是 gdk
//解决方法就是正确的告诉浏览器我给你发送的内容是什么编码的
//在 http 协议中,'Content-type',就是用来告诉对方我给你发送的数据内容是什么类型

// res.setHeader('Content-Type', 'text/plain; charset=utf-8')
// res.end('你好,世界')

var url = req.url
if (url === '/plain') {
//text/plain就是普通文本
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('你好,世界')
} else if (url === '/html') {
//如果你发送的是html格式的字符串,也要告诉浏览器发送的是html格式的
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end('<h1>你好,html<h1>')
}




})
server.listen(3000, function() {
console.log('Server is running...')
})

node中的JavaScript

核心模块

Node 为 JavaScript 提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具体的核心模块中了。
例如文件操作fs核心模块,http服务构建的http模块,path路径操作模块、os操作系统信息模块……

1
2
3
4
5
6
7
8
9
10
    //获取机器信息
var os = require('os')
//操作路径
var path = require('path')
//获取当前机器的 cpu 信息
console.log(os.cpus())
//memory 内存
console.log(os.totalmem())
//extname extension name
console.log(path.extname('c:/a/b/c/d/hello.txt'))

更多模块用法参考官网

Web服务器开发

ip地址和端口号

  • ip地址用来定位计算机
  • 端口号用来定位具体的应用程序
  • 一切需要联网通信的软件都会占用一个端口号
  • 端口号范围从0~65536之间
  • 在计算机中有一些默认端口号,最好不要去使用
    • 例如 http 服务的80
  • 我们在开发过程中使用一些简单好记的端口号就行了,例如3000、5000等
  • 可以同时开启多个服务,但一定要确保不同服务占用的端口号要不一样

Content-Type

可以在这里查询对应的Content-Type:http://tool.oschina.net/
Content-Type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//1、结合 fs 发送文件中的数据
//2、Content-Type
// http://tool.oschina.net/commons
// 不同的资源对应的 Content-Type 是不一样的
// 图片不需要指定编码
// 一般只为字符数据才指定编码
var http = require('http')
var fs = require('fs')

var server = http.createServer()
server.on('request', function(req, res) {
var url = req.url
if (url === '/') {
fs.readFile('../resource/index.html', function(err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf8')
res.end('文件读取失败,请稍后重试~')
} else {
//data默认是二进制数据,可以通过 .toString转为我们认识的字符串
//res.end()刚好支持两种数据类型,一种是二进制,一种是字符串
res.setHeader('Content-Type', 'text/html; charset=utf8')
res.end(data)
}
})

} else if (url === '/picture') {
//url:统一资源定位符
//一个 url 最终其实是要对应到一个资源的
fs.readFile('../resource/preview.jpg', function(err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf8')
res.end('文件读取失败,请稍后重试~')
} else {
//图片就不需要指定编码了,因为我们常说的编码一般是:指字符编码
res.setHeader('Content-Type', 'image/jpeg')
res.end(data)
}
})

}
})
server.listen(3000, function() {
console.log('Server is running...')
})

请求对象 Request

响应对象 Request

在 node 中使用模板引擎

统一处理静态资源

服务端渲染

源代码可以去我的 github 克隆

-------------本文结束感谢您的阅读-------------
木槿前端不求人,有空就来坐坐。
0%