http模块
var http = require('http'); // 引入http模块
var url = require('url'); // 引入url模块
var querystring = require('querystring'); // 引入查询字符串模块
http.createServer(function (request, response) { // 创建http服务
response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应头部
var parseObj = url.parse(req.url, true) // 解析URL(get请求)
var parseObj = querystring.parse(body); // 解析URL参数(post请求)
response.write("'<h4>Hello World</h4>\n'") // 发送响应主体
response.end(); // 结束响应
})
events事件模块
var events = require('events'); // 引入事件模块
var evEmit = new events.EventEmitter(); // 创建事件对象
实例方法
evEmit.on("事件名", connectHandler(参数1,参数2...)); // 绑定事件
evEmit.once("事件名", connectHandler); // 单次绑定事件
evEmit.removeListener("事件名", connectHandler); // 移除事件
evEmit.removeAllListeners(### event); // 移除所有事件
evEmit.emit("事件名",参数1,参数2..); // 触发事件
evEmit.setMaxListeners(n); // 设置绑定默认数量
evEmit.listeners(### event); // 返回监听器(函数)数组
模块方法
evEmit.listenerCount("事件名"); // 返回指定事件的监听器数量
事件
evEmit.on("newListener", connectHandler(事件名称,回调));
// 该事件在添加常规事件时触发
// newListener回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入
evEmit.on("error", connectHandler(错误对象));
// 如果EventEmitter没有为error事件注册至少一个监听器,当error事件触发时,会抛出错误、打印堆栈跟踪、且退出 Node.js 进程,因此最佳实践是应该始终为error事件注册监听器
Buffer缓冲区
var buf = new Buffer(256); // 创建缓冲实例
写入缓冲区
buf.write("字符",起始索引,字节长度,编码类型) // 返回buf实际能够写入的长度
读取缓冲区
buf.toString(编码类型,起始索引,结束位置) // 返回解码字符串
Buffer转JSON
buf.toJSON() // 返回json对象
缓冲区合并
Buffer.concat(buf数组,合并长度) // 返回合并后的buf对象
缓冲区比较
Buffer.compare(buf1,buf2) // 返回一个数字(buf1在buf2之前,之后或相同)
buf1.compare(buf2) // ...
拷贝缓冲区
sourceBuf.copy(targetBuf,targetStart,sourceStart,sourceEnd)
// 无返回值
// sourceBuf-拷贝对象
// targetBuf-被拷贝对象
缓冲区裁剪
buf.slice(0,2) // 返回一个新的缓冲区(它和旧缓冲区指向同一块内存)
Stream流
流类型
Readble => 可读流
Writable => 可写流
Duplex => 可读写流
Transform => 在读写过程中可以修改和变换数据的流(可读可写)
常用事件
data => 当有数据可读时触发
end => 没有更多的数据可读时触发
error => 在接收和写入过程中发生错误时触发
finish => 所有数据已被写入到底层系统时触发
读取流数据
var data = "";
var readerStream = fs.createReadStream('input.txt') // 创建可读流
readerStream.setEncoding('UTF8') // 设置编码
readerStream.on('data',function(chunk){ // 绑定data事件
data += chunk;
})
数据写入流
var data = '菜鸟教程官网地址:www.runoob.com';
var writerStream = fs.createWriteStream('output.txt'); // 创建可写流
writerStream.write(data,'UTF8'); // 使用utf8编码写入数据
writerStream.end("字符数据",编码,回调函数); // 声明文件结尾
writerStream.on('finish', function() { // 绑定finish事件
console.log("写入完成。");
});
module模块
require
"./"为当前目录
一个Node文件就是一个模块(js文件,json或者编译过的c/c++模块)
exports
exports.A=... 把A作为模块的访问接口,require后通过"对象.接口"的形式使用
module.exports=A 把A作为整个模块进行对外,require后即可直接使用
module.exports的操作是唯一的,后面的会覆盖前面的
require的查找策略
- 文件模块缓存 => 原生模块缓存存 => 原生模块存 => 文件模块
require接受的参数
http、fs、path等,原生模块
../mod或../mod,相对路径的文件模块
./pathtomodule/mod,绝对路径的文件模块
mod非原生模块的文件模块
commonjs规范
module.exports才是真正的接口,exports只不过是它的一个辅助工具
所有的exports收集到的属性和方法,都赋值给了module.exports,最终返回给调用的是module.exports而不是exports
如果module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略
你的模块可以是任何合法的javascript对象--boolean, number, date, JSON, string, function, array...
node函数
- 函数传递和匿名函数的使用
node路由
作为处理请求模块存在
通过http模块创建服务,url模块解析路径,路由模块被合并注入到http模块,以对返回并解析了的路径值进行区别的程序处理
node全局对象
__filename
表示当前正在执行的脚本的文件名,返回脚本所在的绝对路径
如果在模块中,则返回模块文件的路径
__dirname
- 表示当前执行脚本所在的目录
process
用于描述当前Node.js进程状态的对象,属于一个全局变量,即global对象的属性
-
常用事件
exit(当进程准备退出时触发)
beforeExit(当node清空事件循环,并且没有其他安排时触发)
uncaughtException(当一个异常冒泡回到事件循环时触发)
signal(当进程接收到信号时就触发)
util模块
util.inherits
实现对象间原型继承
参数分别为(子函数,父函数)
util.inspect
将任意对象转换为字符串的方法,通常用于调试和错误输出
接受4个参数——(转换对象,是否输出隐藏信息,递归层次,控制台输出颜色)
util.isArray
util.isRegExp
util.isDate
util.isError
FileSystem模块
异步·打开文件
fs.open(filePath,打开方式,权限,callback)
// callback包含2个参数,分别为err对象,文件描述符(fd)
异步·获取文件信息
fs.stat(filePath,callback)
// callback包含2个参数,分别为err对象和stats对象
// stats对象包含stats相关属性和方法,用于文件信息判断
异步·写入文件
fs.writeFile(file, data,options,callback) // callback只包含err对象
异步·读取文件
fs.readFile(file, option, callback)
// callback包含2个参数,分别为err对象和data文件
// 如果options是一个字符串,则它指定了字符编码
异步·读取
fs.read(fd, buffer, offset, length, position, callback)
fd - fs.open()回调返回的文件描述符
buffer - 数据写入的缓冲区
offset - 缓冲区写入的写入偏移量
length - 要从文件中读取的字节数
position - 文件读取的起始位置,如果position的值为 null,则会从当前文件指针的位置读取
callback - 有三个参数err, bytesRead, buffer,err为错误信息,bytesRead表示读取的字节数,buffer为缓冲区对象
异步·关闭文件
fs.close(fd, callback) // callback没有参数
异步·截取文件
fs.ftruncate(fd, len, callback) // callback只包含err对象
异步·删除文件
fs.unlink(path, callback) // callback没有参数
异步·创建目录
fs.mkdir(path, 文件权限, callback) // callback没有参数
异步·读取目录
fs.readdir(path, 文件权限, callback) // callback包含两个参数,分别为err对象和files列表
异步·删除目录
fs.rmdir(path, callback) // callback没有参数
express框架
请求和响应
app.get('/', function (req, res) {}) // 处理请求和响应
req.query // 获取查询字符串
res.send() // 响应数据
res.sendFile() // 响应文件(需要绝对路径,除非设置了根路径)
res.end() // 结束响应
var server = app.listen(8081,callback) // 创建服务
server.address() // 获取地址信息
express.static(资源目录) // 托管静态资源
var bodyParser = require('body-parser')
bodyParser.urlencoded({ extended: false }) //创建application/x-www-form-urlencoded编码解析
路由
- 决定了由谁(指定脚本)去响应客户端请求
RESTful API
一种软件设计风格和原则
web Services满足这种rest风格(体现为http请求服务)
node多进程
node虽是以单线程的模式运行的,但可以在多核cpu的系统上创建多个子进程,从而提高性能
-
每个子进程总是带有三个流对象
- child.stdin——标准输入
- child.stdout——标准输出
- child.stderr——标准错误
-
node提供child_process模块来创建子进程,方法有:
- exec——使用子进程执行命令,缓存子进程的输出,以回调函数参数的形式返回
- 参数:
- command:将要运行的命令,参数使用空格隔开
- options:参数对象
- callback:回调函数(error,stdout,stderr)
- 参数:
- spawn——使用指定的命令行参数创建新进程
- 参数:
- command:将要运行的命令
- args:字符串参数数组
- options:参数对象
- 参数:
- fork——spawn的特殊形式,用于在子进程中运行的模块。
- 与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信
- 参数:
- modulePath:将要在子进程中运行的模块
- args:字符串参数数组
- options:参数对象
- exec——使用子进程执行命令,缓存子进程的输出,以回调函数参数的形式返回
mySQL
连接数据库
'SELECT 1 + 1 AS solution';
增
'INSERT INTO websites(Id,name,url,alexa,country) VALUES(0,?,?,?,?)';
删
'DELETE FROM websites where id=6';
改
'UPDATE websites SET name = ?,url = ? WHERE Id = ?';
查
'SELECT * FROM websites';
mongoDB
链接数据库
MongoDB会自动创建数据库和集合,使用前不需要手动去创建
增
collection.insert(data,callback);
删
collection.remove(whereStr,callback);
改
collection.update(whereStr,updateStr,callback);
查
collection.find(whereStr).toArray(callback);