参考文献:https://www.tutorialspoint.com/nodejs/nodejs_quick_guide.htm
introduction
Node.js是一个基于V8引擎的服务端平台。简单来说
Node.js = Runtime Environment + JavaScript Library
Node.js应用程序由以下三个重要组件组成:
- 导入所需模块
- 创建服务器
- 读取请求和响应请求
创建Node.js应用程序
step 1. 导入所需模块
我们使用require命令加载所需模块并返回模块实例到局部变量中,如下所示:
var http = require("http"); //导入Node.js Build-in模块
var square = require("./hello.js"); //导入自定义js文件,所有hello.js文件内容都会被执行。
附录:Node.js Build-in Modules and functions
参考:https://www.w3schools.com/nodejs/ref_modules.asp
Module | Description |
---|---|
assert | 提供一系列的断言测试功能 |
buffer | 处理二进制数据 |
child_process | 运行子进程 |
cluster | 将当前进程克隆成多个同时运行的子进程 |
crypto | OpenSSL加密函数 |
dgram | 提供UDP数据报套接字的实现 |
dns | 域名查询服务 |
events | 处理事件 |
fs | 文件系统模块 |
http | 将Node.Js设为http服务器 |
https | 将Node.js设为https服务器 |
path | 处理文件路径 |
net | 创建服务器和客户端 |
os | 提供操作系统的信息 |
querystring | 将请求参数字符串转为一个object对象 |
readline | 将数据流中数据以行的形式读出 |
stream | 处理数据流 |
string_decoder | 将Buffer对象解码为字符串 |
timers | 在指定时间后执行一个命令 |
tls | 提供了实现传输层(TLS Transport Layer Security)和安全套接层(SSL Secure Socket Layer)的方法 |
url | 实现url对象和字符串之间的转换 |
util | 一些实用的函数 |
zlib | 用于压缩和解压文件 |
vm | 在虚拟机中编译JavaScript代码 |
step 2. 创建服务器
通过http.createServer()创建http服务器,然后通过listen将服务器绑定到8081端口。
var http = require('http');
http.createServer(function(request, response){
response.writeHead(200, {
'Content-Type': 'text/plain'});
response.end('Hello World!\n');
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
step 3. 测试请求和响应
将第二步代码保存为main.js,然后进入该文件目录,运行node命令:
node main.js
验证输出为:
Server running at http://127.0.0.1:8081/
打开浏览器输入http://127.0.0.1:8081/
NPM
Node包管理器(Node Package Manager)主要有两个作用:
- 在线查询node.js包的仓库(search.nodejs.org)
- 提供安装node.js包的命令行工具,以及包的版本管理和依赖管理
npm随Node.js绑定安装。如果需要把npm升级到最新版本,通过如下命令进行:
npm install npm -g
其中-g表示global全局。
安装任何Node.js模块的命令如下:
npm install <Module Name>
比如安装大名鼎鼎的web框架模块express
npm install express
安装好后,express就会出现在工程目录下的node_modules目录中。
查看安装信息:
npm list
现在就可以通过require语句导入express模块:
var express = require('express');
卸载一个模块:
npm uninstall express
更新一个模块:
npm update express
回调的概念
回调函数是指当满足某种条件后用函数指针的形式调用函数。在Node.js中,所有API都支持回调的方式编写。当异步执行API函数时,不会等待API函数执行完,而是继续下个语句,当API函数执行完后再以回调的方式返回函数执行结果。比如fs模块下异步读取文件的API函数readFile的阻塞形式为readFileSync。
现创建一个名为input.txt的文本文件,内容如下:
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
阻塞代码示例:
使用以下代码创建一个名为main.js的js文件
var fs = require('fs');
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");
运行结果:
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended
非阻塞代码示例:
var fs = require('fs');
fs.readFile('input.txt', function(err, data){
if(err)
return console.error(err);
console.log(data.toString());
});
console.log("Program Ended");
运行结果:
Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
结论:阻塞程序按顺序执行,异步程序按回调的方式执行
在Node.js中,任何异步函数都接受回调函数作为最后一个参数,而回调函数接受错误作为第一个参数。
事件
事件和回调不同之处在于,回调函数是在异步函数执行完成之后执行的,事件是在事件触发之后执行的。事件采用观察者模式,事件监听函数充当Observer,观察者会不断循环检测事件是否被触发。
- 创建事件发射器
var events = require('events'); //导入事件模块 var eventEmitter = new events.EventEmitter(); //创建事件发射器
- 注册事件
eventEmitter.on('eventName', eventHandler);
- 触发事件
eventEmitter.emit('eventName');
举例:
var events = require('events');
var eventEmitter = new events.EventEmitter();
var connectHandler = function connected(){
console.log('connnected successful.');
eventEmitter.emit('data_received');
};
eventEmitter.on('connection', connectHandler);
eventEmitter.on('data_received', function(){
console.log('data received successfully.');
});
eventEmitter.emit('connection');
console.log('Program Ended.');
注:
- 同一个事件可以添加多个监听器,事件触发后会执行所有监听器,执行顺序按照添加时的列表顺序执行。
var events = require('events'); var eventEmitter = new events.EventEmitter(); var eventHandler1 = function(){ console.log('event 1'); } var eventHandler2 = function(){ console.log('event 2'); } var eventHandler3 = function(){ console.log('event 3');