什么是Node.js
- Node.js不是一门语言,不是库、不是框架,是一个JavaScript运行时环境,一个平台;简单说Node.js可以解析和执行JavaScript代码。
- Node.js中的JavaScript没有DOM、BOM,只有EcmaScript(基本的语法),在Node这个JavaScript执行环境中为JavaScript提供了一些服务器级别的操作API,例如文件读写,网络服务的构建,网络的通信,http服务器等
- Node.js特性:事件驱动、非阻塞IO模型(异步);
- npm是世界上最大的开源库生态系统,绝大多数JavaScript相关包都存放在了npm上,这样左的目的是为了让开发人员更方便的去下载使用;
Node.js能做什么
- Web服务器后台
- 命令行工具
- npm(node)
- git(c语言)
- hexo(node)…
Node中简单的错误处理
//fs是flie-system的简写,就是文件系统的意思;
//1.用require方法加载fs核心模块
var fs = require('fs');
//2.读取文件,两个参数分别为读取文件的路径和回调函数
//回调函数的两个参数
// 成功 data为数据 error为null
// 失败 data为undefind error为错误对象
fs.readFile('./data/a.txt', function (error, data) {
// console.log(data);
// console.log(data.toString());
// console.log(error);
// console.log(data);
if(error){
console.log('读取文件失败');
}else{
console.log(data.toString());
}
});
用Node构建一个服务器
//Node中专门提供了一个核心模块:http
//http这个模块的职责就是帮你创建编写服务器的
//1.加载http核心模块
var http = require('http');
//2.使用http.createServer()方法创建一个Web服务器
//返回一个Server实例
var sever = http.createServer();
//3.服务器要干嘛?接受发出的请求,处理请求,给个反馈(发送响应)
//注册request请求事件,当客户端请求发送过来,就会自动触发服务器的request请求事件,
//然后执行第二个参数,回调处理函数
sever.on('request',function(){
console.log('收到客户端请求');
});
//4.绑定端口号,启动服务器
sever.listen(3000,function(){
console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/来访问');
});
var http = require('http');
var sever = http.createServer();
//request 请求事件处理函数,需要接收两个参数
//Request 请求对象,请求对象可以用来获取客户端的一些请求信息,例如请求路径
//Response 响应对象,响应对象可以用来给客户端发送响应消息
sever.on('request', function (request, response) {
console.log('收到客户端请求,请求路径是:' + request.url);
//response对象有一个方法:wirte可以用来给客户发送响应数据
//wirte可以多次使用,但最后一次一定要使用end来结束响应,否则客户端会一直等待
response.write('hello');
response.write('node.js');
//结束响应,告诉客户端响应完毕,可以呈递给用户了
response.end();
});
sever.listen(3000, function () {
console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/来访问');
});
- 响应内容只能是二进制数字或者字符串;
Node中的js核心模块
- EcmaScript:没有BOM和DOM;
- 核心模块:
- Node为Javascript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了。
- 例如文件操作的
fs
核心模块,http服务构建的http
模块,path
路径操作模块,os
操作系统信息模块… - 注意:以后只要是核心模块,就必须操作如下:
var fs = require('fs');
var http = require('http');
-
Node中的模块系统
-
相对路径必须加./
//可以
require('./b.js');
//推荐:可以省略后缀名
require('./b);
//require是一个方法
//它的作用是用来加载模块的
//在node中模块有三种:
//1.具名的核心模块,例如fs,http
//2.用户自己编写的文件模块
var foo = 'aaa';
console.log('开始执行a.js文件');
//相对路径必须加./
require('./b.js');
console.log('a.js文件执行结束');
console.log(foo);
//在node中没有全局作用域,只有模块作用域,或者叫文件作用域,超出本文件都无效;
///外部访问不到内部,内部也访问不到外部;
var foo = 'bbb';
console.log('b start');
require('./c.js');
console.log('b end');
console.log('ccc');
PS E:\1前端视频\前后端交互阶段\nodejs总结\day1\07-简单的模块化> node a.js
开始执行a.js文件
b start
ccc
b end
a.js文件执行结束
aaa
- 加载与导出
//require方法有两个作用:
//1.加载文件模块并执行里面的代码
//2.拿到被加载文件模块导出的接口对象
//在每个文件模块中都提供了一个对象:exportss
//exports 默认是一个空对象{}
var bExports = require('./b.js');
// console.log(foo);;
console.log(bExports);
console.log(bExports.foo);
console.log(bExports.add(10,20));
var foo = 'bbb';
exports.foo = 'hello';
exports.add = function (x, y) {
return x + y;
}
PS E:\1前端视频\前后端交互阶段\nodejs总结\day1\07-简单的模块化\加载与导出> node a.js
{ foo: 'hello', add: [Function (anonymous)] }
hello
30
IP地址和端口号
- IP地址用来定位计算机;
- 所有的联网的程序都需要进行网络通信,计算机中只有一个物理网卡,而且同一个局域网中,网卡的地址必须唯一,网卡是通过 唯一的IP地址来定位的;
- 端口号是用来定位具体应用程序的;
- 所有需要联网通信的软件都必须具有端口号;
- 端口号的范围0-65536之间;
- 在计算机中有一些默认的端口号,最好不要用,比如http服务的80;
- 我们在开发过程中使用一些简单好记的就可以了,例如3000、5000等没什么含义的;
- 可以同时开启多个服务,但是要保证不同服务占用不同的端口号;
// ip 地址用来定位计算机
// 端口号用来定位具体的应用程序
// 所有需要联网通信的应用程序都会占用一个端口号
var http = require('http')
var server = http.createServer()
// 2. 监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
console.log('收到请求了,请求路径是:' + req.url)
console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort)
res.end('hello nodejs')
})
server.listen(5000, function () {
console.log('服务器启动成功,可以访问了。。。')
})
响应内容类型
- 在http协议中,
Content-Type
就是用来告知对方,我给你发送的数据内容是什么类型; - 在线查询Content-Type的网址http://tool.oschina.net/commons
//一个简单web服务
//1.创建server
var http = require('http');
var server = http.createServer();
//2.监听request请求事件,设置请求处理函数
server.on('request', function (req, res) {
//在服务端默认发送的数据是utf8编码内容,但浏览器会按照当前操作系统默认编码去解析
//中文操作系统是gbk,解决方法就是告诉浏览器发送内容为什么编码
// res.setHeader('Content-Type', 'text/plain;charset=utf-8');
// res.end('hello 事件');
var url = req.url;
//text/plain就是普通文本
if (url === '/plain') {
res.setHeader('Content-Type', 'text/plain;charset=utf-8');
res.end('hello 事件');
} else if (url === '/html') {
//text/html是html的文本
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.end('<p>hello html <a href="">点我</a></p>');
}
});
server.listen(3000, function () {
console.log('Server is running...');
});
if (url === '/plain') {
res.setHeader('Content-Type', 'text/plain;charset=utf-8');
res.end('hello 事件');
} else if (url === '/html') {
//text/html是html的文本
res.setHeader('Content-Type', 'text/plain;charset=utf-8');
res.end('<p>hello html <a href="">点我</a></p>');
}
总结
- 模块系统,在Node中没有全局作用域的概念;
- 在Node中只能通过
require
方法来加载执行多个JavaScript脚本文件; - require加载中只能执行文件中的代码,文件与文件之间由于模块作用域,所以不会有污染的问题;
- 模块是完全封闭的;
- 外部无法访问内部;
- 内部也无法访问外部;
- 但是某些情况下,模块与模块是需要进行通信的,每个模块中都提供了一个对象:
exports
,默认是一个空对象; - 把被需要被外部访问使用的成员手动加载到
exports
接口对象中,然后谁require
这个模块就会得到exports
接口对象 - 核心模块:是由Node提供一个个的具名的模块,它们都有自己特殊的名称标识,例如:
fs
文件操作模块http
网络服务构建模块os
操作系统信息模块path
路径处理模块…
- 所有核心模块在使用时都必须先手动使用
require
方法来加载,然后才可以使用,例如
var fs = require('fs');
- IP是用来定位计算机的,端口号是用来定位具体的应用程序;
- Content-Type:服务器最好每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉;
- 不同的资源对应的Content-Type是不一样的,具体参照http://tool.oschina.net/commons
- 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题;
- 通过网络发送文件:
- 发送的并不是文件,本质是来讲发送的是文件的内容;
- 当浏览器收到服务器的响应内容之后,就会根据你的Content-Type进行对应的解析处理;