这篇文章主要是了解node.js的基础知识,包括node.js是什么?node.js能干什么?以及学习node的几个核心模块的小栗子。包括node读写文件,和利用http这个核心模块创建一个简单的web服务器。

了解node.js

  • 1.1 node.js是什么?
    • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
      • node不是一门语言
      • node.js不是框架,不是库
      • node.js是JavaScript运行时环境,简单来讲node.js可以解析和执行JavaScript代码
      • 以前只有浏览器能解析JavaScript代码,有了node.js后JavaScript可以脱离浏览器运行
      • Chrome V8 引擎是目前公认的解析JavaScript最快的
      • node.js作者把Google Chrome v8 引擎移植出来,开发了一个独立的JavaScript运行时环境。
    • Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
      • 非阻塞式 I/O 的模型(异步)
  • 1.2 npm

    • npm是世界上最大的开源库生态系统
    • 绝大多数的JavaScript相关包都放在了npm上,这样做的目的是方便开发人员下载使用
    • eg:npm install jQuery
  • 1.3 浏览器中的javascript

    • ECMAScript
      • 基本语法
      • if
      • var
      • function
      • Object
      • Array
    • BOM
    • DOM
  • 1.4 Node.js中的JavaScript
    • 没有BOM、DOM
    • ECMAScript
    • 在node这个JavaScript执行环境中为JavaScript提供一些服务器级别的操作API
      • 文件读写
      • 网络服务的构建
      • 网络通信
      • http服务器
      • 。。。

        node.js能做什么?

  • web服务器后台
  • 命令行工具
    • npm(基于node)
    • git(基于C语言)
    • hexo(基于node)
  • 对前端开发来讲接触node最多的是她的命令行工具,自己写的很少
    • webpack
    • gulp
    • npm

开始学习node.js

2.1 读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Node 中如果想要进行文件操作,就必须引入 fs 这个核心模块,该模块提供了所有文件操作的相关API
let fs = require('fs');
/** readFile(path, callback)[读取文件内容:第一个参数是文件路径,第二个参数是回调]
* @param {[type]} error [成功:null,失败:错误对象]
* @param {[type]} data) [成功:数据,失败:undefined]
* @return {[type]} [description]
*/
fs.readFile('./data/my.txt', function (error, data){
if(error){
console.log('读取文件失败')
}else{
console.log(data.toString()); //文件中存储的其实都是二进制数据,可以通过toString方法转化成文字
}
});

2.2 写文件

1
2
3
4
5
6
7
8
9
10
/** writeFile(path, con, callback)[读取文件内容:第一个参数是文件路径,第二个参数是写入文件的内容,第三个参数是回调]
* @param error [成功:null,失败:错误对象]
*/
fs.writeFile('./data/hello.md', '测试写入内容jack like node', function (error){
if(error){
console.log('写入文件失败');
}else{
console.log('写入文件成功');
}
});

2.3 使用node构建一个web服务器

  • Node专门提供了一个核心模块:http负责构建服务器
  • 使用 http.createServer()方法创建一个web服务器
  • 服务器要干什么?
    • 提供对数据的服务
    • 发请求、接受请求、处理请求
    • 注册 request 请求事件
    • 当客户端请求过来,就会自动触发服务器的 request 的请求事件然后触发回调
    • 发回响应
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
//引入核心模块http
let http = require('http');
//创建服务器
let server = http.createServer();
//接受请求发送响应
//request 请求对象可以用来获取客户端的请求信息,比如请求路径request.url,请求地址request.socket.remoteAddress,请求端口request.socket.remotePort等
//Response 响应对象可以用来给客户端发送响应消息
server.on('request', function (request, response){
//响应内容只能是 二进制数据或者字符串
//判断url处理响应
var url = request.url;
if(url == '/phone'){
var products = [
{name: 'iphone X', price: 9999},
{name: 'smartisan R1', price: 8888}
]
response.end(JSON.stringify(products));
}else{
response.end('404 Not Found');
}

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

2.4 使用node构建web服务器结合fs发送文件数据

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
// 1. 结合 fs 发送文件中的数据
// 2. Content-Type
// 服务端默认发送的数据是 utf8 编码,如果发送数据时有Content-Type则浏览器会按照给定的编码规则解析,否则照当前操作系统的默认编码去解析
// 不同的资源对应的 Content-Type 不同,图片不需要指定编码,一般只为字符数据才指定编码
// http://tool.oschina.net/commons
const http = require('http');
const fs = require('fs');

let server = http.createServer();
server.on('request', function (req, res){
let 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{
res.setHeader('Content-type', 'text/html; charset=utf-8');
res.end(data);
}
});
}else if(url === '/baby'){
fs.readFile('./resource/ab2.jpg', function (err, data){
if(err){
res.setHeader('Content-type', 'text/plain; charset=utf-8');
res.end('读取图片失败')
}else{
res.setHeader('Content-type', 'charset=utf-8');
res.end(data);
}
})
}
});

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