1.第一个应用:
demo.js
2.使用npm命令安装模块:
全局安装:
npm install express -g
1. 将安装包放在 /usr/local 下。
2. 可以直接在命令行里使用。
3. 不能通过 require() 来引入本地安装的包。
接下来我们使用全局方式安装 express
本地安装:
npm install express
1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
2. 可以通过 require() 来引入本地安装的包。
3.Node.js回调函数
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。
4.Node.js事件循环
整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
5.Node.js EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
1.加载模块
加载核心模块只能通过模块名引用
可以通过绝对路径加载非核心模块
加载文件夹模块:
文件夹中不存在package.json文件,那么包的 入口点会嘉定为默认值index.js
如果存在,node就会尝试解析该文件并查找main属性,将main属性当做入口点的相对路径
如果一个模块名既不是相对路径,也不是核心模块,node会在当前目录的node_modules文件夹中查找该模块,如果找不到则往父级的文件夹node_modules中中查找
var module = require("module_name")
2.导出模块
module.exports = func
3.缓存模块
模块在首次加载会被缓存起来
4.创建缓冲区
使用utf-8创建
var buf = new Buffer('hello world');
指定编码格式:
var buf = new Buffer('hello world','base64');
指定长度
var buf = new Buffer(1024);
5.在缓冲区上获取和设置数据
var buf = new Buffer('hello world');
console.log(buf[3]);// ->108
buf[99] = 125 //设置数据
console.log(buf.length);//获取长度
var buf = new Buffer(100);//迭代内容并设置每个字节
for (var i =0; i <buf.length; i++){
buf[i] = i
};
6.切分缓冲区:可以通过指定起始位置和结束位置来切分缓冲区,从而创建一个更小的缓冲区
var buf = new Buffer('this is the content of my buffer');
var smallerBuffer = buf.slice(8,19)
console.log(smallerBuffer.toString()); //the content
并没有创建新的内存,只是对父缓冲区的引用
7.复制缓冲区
var buf1 = new Buffer('this is the content of my buffer');
var buf2 = new BUffer(11);
buf1.copy(buf2,0,8,19)
console.log(buf2.toString()); //the content
8.缓冲区解码
utf-8:
var str = buf.toString();
指定方式:
var str = buf.toString( "base64");
toString方法转换格式:
var buf1 = new Buffer('this is the content of my buffer');
var base64String = buf.toString('base64')
9.标准回调模式:
var fs = require('fs')
fs.readFile('./index.js', function(err,fileContent){
if (err) {
throw err
}
console.log('fileContent',fileContent.toString());
});
10.事件发射器模式
事件发射器就是可以发射事件的对象,而事件监听器则是可以绑定到事件发射器上的代码,负责监听特定类型的事件
var req = http.request(option,function(response){
response.on("data",function(data){
console.log("some ...");
});
response.on("end",function(){
console.log("response ended");
});
});
req.end();