创建及发布模块
创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (node_modules) runoob # 模块名
version: (1.0.0)
description: Node.js 测试模块(www.runoob.com) # 描述
entry point: (index.js)
test command: make test
git repository: https://github.com/runoob/runoob.git # Github 地址
keywords:
author:
license: (ISC)
About to write to ……/node_modules/package.json: # 生成地址
{
"name": "runoob",
"version": "1.0.0",
"description": "Node.js 测试模块(www.runoob.com)",
……
}
Is this ok? (yes) yes
以上的信息,你需要根据你自己的情况输入。在最后输入 "yes" 后会生成 package.json 文件。
接下来我们可以使用以下命令在 npm 资源库中注册用户(使用邮箱注册):
$ npm adduser
Username: mcmohd
Password:
Email: (this IS public) mcmohd@gmail.com
接下来我们就用以下命令来发布模块:
$ npm publish
如果你以上的步骤都操作正确,你就可以跟其他模块一样使用 npm 来安装。
REPL(node自带的交互式解释器)
Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
Node 自带了交互式解释器,可以执行以下任务:
读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
执行 - 执行输入的数据结构
打印 - 输出结果
循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
Node 的交互式解释器可以很好的调试 Javascript 代码。
阻塞代码实例:
var fs = require('fs')
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log('程序执行结束');
输出结果:
上次吃面是什么时候,你关心吗?
程序执行结束
非阻塞代码实例
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
事件循环
事件驱动程序
node有多个内置事件,我们可以通过引入events模块,并通过实例化EventEmitter类来绑定和监听事件,代码如下:
//引入events模块
var events = require('envents');
//创建eventEmitter对象
var eventEmitter = new events.EventEmitter();
// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);
//我们可通过成序触发事件
eventEmitter.emit('eventName')
// 引入 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("程序执行完毕。");
一般情况下将回调函数作为最后一个参数,回调函数接收的错误对象作为第一个参数
node.js EventEmitter
EventEmitter类
events模块只提供了一个对象:events.EventEmitter。
EventEmitter的核心就是事件触发和时间监听器功能的封装
可以通过require(‘events’)来访问该模块
//引入events模块
var events = require('events')
//创建eventEmitter对象
var eventEmitter = new EventEmitter()
EventEmitter对象如果在实例化的时候发生错误,会触发error时间,当添加新的监听事件时,newListener事件会触发,当监听被移除的时候,removeListener事件会触发
// event.js文件
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter()
event.on('some_event', function(){
console.log('some_event 事件触发')
})
setTimeout(function(){
event.emit('some_event')
}, 1000)
EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递
事件的方法及描述
var callback = function(stream){
console.log('someone connected!')
};
server.on('connection', callback)
server.removeListener('connection', callback)
类方法:
事件:
当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。
我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃
继承EventEmitter
1. js自身只有字符串数据类型,没有二进制数据类型
2. 在node.js中,定义了一个buffer类,该类用来创建一个专门存放二进制的数据的缓存区
3. 一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
4. 在v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象。
buffer实例一般用于表示编码字符的序列,比如UTF-8、UCS2、Base64、或16进制编码的数据。通过显示的字符编码,就可以在buffer实例与普通的js之间进行相互转换
eg:
const buf = Buffer.from('runoob', 'ascii');
// 输出 72756e6f6f62
console.log(buf.toString('hex'))
// 输出cnVub29i
console.log(buf.toString('base64'))
Node.js目前支持的字节编码包括:
创建buffer类
eg:
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');
写入缓冲区:
语法: buf.write(string, offset[, length])
参数:
从缓冲区读取数据
语法: buf.toString([encoding[, start[, end]]])
参数:
返回值:
解码缓冲区数据并使用指定的编码返回字符串
将buffer转换为json对象
语法:buf.toJSON()
返回值:返回json对象
缓冲区合并
语法:Buffer.concat(list[, totalLength])
参数:
返回值:
返回一个多成员合并的新buffer对象
缓冲区比较
语法:该语法在node.js v-0.12.2引入
buf.compare(otherBuffer)
参数:
返回值:
返回一个数字,表示buf在otherBuffer之前(返回负值),之后(返回正值)或者相同(返回0)
拷贝缓冲区
语法:buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
参数:
返回值:
没有返回值
node.js有四种流类型:
所有的Stream对象都是EventEmitter的实例,常用的事件有:
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
同步和异步读取:
var fs = require('fs')
// 异步读取
fs.readfile('input.txt', function(err, data){
if(err){
return console.error(err)
}
console.log('异步读取'+data.toString)
})
// 同步读取
fs.readFileSync('input.txt')
console.log('同步读取'+ data.toString)
console.log('程序结束')
打开文件
语法:fs.open(path, flags[, mode], callback)
参数:
获取文件信息
语法:fs.stat(path, callback)
参数:
写入文件
语法:fs.writeFile(file, data[, options], callback)
注意:writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
参数:
读取文件:
语法:fs.read(fd, buffer, offset, length, position, callback)
注意:writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
参数:
几种常见的模块使用
web应用架构
使用node创建web服务器
简介:是一个简洁灵活的nodejs web引用框架,可以帮助我们创建web应用和http工具,使用它可以快速搭建一个完整功能的网站,它的核心特点是:
安装Express
以上命令会将 Express 框架安装在当前目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录。以下几个重要的模块是需要与 express 框架一起安装的:
app.get('/', function(req, res){
// --
})
对request和response对象的具体介绍:
连接数据库: 根据实际的配置修改数据库的用户名、密码、及数据库名
var mysql = require('mysql')
var cOnnection= mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'test'
})
connection.connect()
connection.query('SELECT 1 + 1 AS solution', function(error, results, fields){
if(error) throw error;
console.log('The solution is: ', results[0].solution)
})
输出结果:The solution is: 2
数据库参数说明: