nodeJS菜鸟教程笔记

时间:2023-03-09 19:15:49
nodeJS菜鸟教程笔记

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:参数对象

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);