初学node

258 阅读8分钟

1、REPL(Read Eval Print Loop: 交互式解释器)

  • REPL 表示一个电脑的环境。类似系统终端或者Unix/Linux shell

2、回调函数。

  • 非阻塞运用。一般是要用异步和非阻塞的。
  • 同步,只能做一件事
  • 异步,做这一件事的时候可以做其他的事
  • 阻塞,只能做一件事,不能做下一件事,阻塞了
  • 非阻塞,做这一件事情的时候,可以同时做另一件事情,就是非阻塞。

3、事件循环

  • node.js是单进程单线程,可以通过事件和回调支持并发。
  • 每个Api是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
  • 基本上所有的事件机制是用设计模式中观察者模式实现。
  • Node.js 使用事件驱动模型,当web server 接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
  • 当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被放回给用户。
  • 这个模型非常高效可拓展性非常强,因为webserver一直接受请求而你等待任何读写操作。
  • 事件循环模型如下:

4、EventEmitter

  • 所有的异步I/O操作在完成时都会发送一个事件到事件队列。
  • 大多数不会直接使用EventEmitter,而是在对象中继承它。包括fs、net、http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。
    • 具有某个实体功能的对象实现事件符合语义,事件的监听和发生应该是一个对象的方法。
    • javascirpt的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系。
  • eventEmitter.on与eventEmitter.addListener()没有区别,且一个事件可以绑定多个回调函数。
  • 若事件队列中出现一个未绑定事件则触发error事件,若未绑定 error事件则程序抛出异常结束执行

5、buffer

  • Buffer.from() 接口去创建Buffer对象。 const buf1 = Buffer.from();
  • 写入缓冲区: buf.write(string[, offset[, length]][, encoding])
  • 从缓冲区读取数据: buf.toString([encoding[, start[, end]]])
  • 将Buffer转换成JSON对象: buf.toJSON()
  • 缓冲区合并 Buffer.concat(list[, totoalLength])
  • 缓冲区比较 buf.compare(otherBuffer);
  • 拷贝缓冲区 buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]])
  • 缓冲区裁剪 buf.slice([start[, end]])
  • 缓冲区长度 buf.length

6、Stream

  • 从流中读取数据: var fs = require('fs'); fs.createReadStream('input.txt');
  • 写入流: var fs = require('fs'); fs.createWriteStream('output.txt');
  • 管道流: readerStream.pipe(writerStream);
  • 链式流: var fs = require('fs'); fs.createReadStream('input.txt').pioe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt'))

7、模块系统

  • 创建模块是为了文件之间可以互相调用。模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
  • 服务器中读取模块的顺序

  • require 接口以下几种参数的传递:

    • http、fs、path等,原生模块
    • ./mod或../mod,相对路径的文件模块
    • /pathtomodule/mod, 绝对路径的文件模块
    • mod,非原生模块的文件模块

8、函数

  • http中传递的一般就是匿名函数
  • 匿名函数如下:
 
     var http = require('http');

     http.createServer(function(request, response) {
         response.writeHead(200, {'Content-Type': 'text/plain'});
         response.write('Hello World');
         response.end();
     }).listen(8888);

  • 非匿名函数如下:
     var http = require('http');

     function onRequest(request, response) {
         response.writeHead(200, {'Content-Type': 'text/plain'});
         response.write('Hello World');
         response.end();
     }

9、路由

  • 需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递
  • 需要url和queryString模块进行解析

10、全局对象

  • __filename 表示正在执行脚本的文件名
  • __dirname 表示当前执行脚本所在的目录
  • setTimeout(cd, ms) 代表定制器的句柄值
  • clearTimeout(t) 全局函数用于停止一个之前通过setTimeout()创建的定时器
  • setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)
  • console 用于控制台标准输出。
  • process 全局变量,global对象的属性。用于描述node.js进程状态的对象,提供了一个与操作系统的简单接口

11、node.js 常用工具 —— util

  • util.inherits(constructor, superConstructor) 实现对象间原型继承的函数
  • util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。
  • util.isArray(object) 判断是否为一个数组
  • util.isRegExp(object) 判断是否为正则表达式
  • util.isDate(object) 判断是否为一个日期
  • util.isError(object) 判断是否为一个错误对象

12、文件系统

  • Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
  • 异步模式下打开文件: fs.open(path, flags[, mode], callback)
  • 获取文件信息: fs.stat(path, callback)
  • 写入文件: fs.writeFile(file, data[, options], callback)
  • 读取文件: fs.read(fd, buffer, offset, length, position, callback)
  • 关闭文件: fs.close(fd, callback)
  • 截取文件: fs.ftruncate(fd, len, callback)
  • 删除文件: fs.unlink(path, callback)
  • 创建目录: fs.mkdir(path[, mode], callback)
  • 读取目录: fs.readdir(path, callback)
  • 删除目录: fs.rmdir(path, callback)

13、Node.js GET/POST请求

  • 获取get请求内容
  • 获取URL的参数: 使用 url.parse 方法来解析 URL 中的参数
  • 获取post请求内容
  • http.ServerRequest 并没有一个属性内容为请求体

14、工具模块

  • OS模块
  • Path 模块
  • Net 模块
  • DNS 模块
  • Domain 模块

15、使用Node创建Web服务器

  • http模块主要用于搭建HTTP服务器和客户端,使用HTTP服务或客户端功能必须调用http模块。

16、Express框架

  • 简洁而灵活的node.js Web应用框架,提供了一系列强大特性帮助你创建各种Web应用。使用 Express 可以快速地搭建一个完整功能的网站。
  • Express 框架核心特性:
    • 设置中间件来响应HTTP请求
    • 定义了路由表来执行不同的HTTP请求动作
    • 通过向模板传递参数来动态渲染HTML页面
  • express请求的方法 require('express'); 令app = express();
  • 用app.get方法,然后一般使用方法如下所示:
  app.get('/', function(req, res) {
      
  })
  • express使用request和response对象处理请求和响应的数据
  • request和response对象的具体介绍:
  Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

    req.app:当callback为外部文件时,用req.app访问express的实例
    req.baseUrl:获取路由当前安装的URL路径
    req.body / req.cookies:获得「请求主体」/ Cookies
    req.fresh / req.stale:判断请求是否还「新鲜」
    req.hostname / req.ip:获取主机名和IP地址
    req.originalUrl:获取原始请求URL
    req.params:获取路由的parameters
    req.path:获取请求路径
    req.protocol:获取协议类型
    req.query:获取URL的查询参数串
    req.route:获取当前匹配的路由
    req.subdomains:获取子域名
    req.accepts():检查可接受的请求的文档类型
    req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
    req.get():获取指定的HTTP请求头
    req.is():判断请求头Content-Type的MIME类型
    Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

    res.app:同req.app一样
    res.append():追加指定HTTP头
    res.set()在res.append()后将重置之前设置的头
    res.cookie(name,value [,option]):设置Cookie
    opition: domain / expires / httpOnly / maxAge / path / secure / signed
    res.clearCookie():清除Cookie
    res.download():传送指定路径的文件
    res.get():返回指定的HTTP头
    res.json():传送JSON响应
    res.jsonp():传送JSONP响应
    res.location():只设置响应的Location HTTP头,不设置状态码或者close response
    res.redirect():设置响应的Location HTTP头,并且设置状态码302
    res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
    res.send():传送HTTP响应
    res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
    res.set():设置HTTP头,传入object可以一次设置多个头
    res.status():设置HTTP状态码
    res.type():设置Content-Type的MIME类型  
  • 通过路由去访问不同页面
  • 加载静态文件:例如图片、css、javascript文件放在public目录下,则可以这样写 app.use(express.static('public'));
  • 经常使用body-parser实现解析 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));
  • 创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data。
  • 可以使用中间件cookie-parser向 Node.js 服务器发送 cookie 信息

17、node.js restful API

  • REST即表述性状态传递(Representational State Transfer,简称REST)
  • 表述性状态转移是一组架构约束条件和原则。REST是设计风格而不是标准。
  • REST基于使用TTP、URL和XML以及HTML。
  • 使用JSON数据格式
  • 基本架构的四个方法
    • GET 获取数据
    • PUT 更新或添加数据
    • DELETE 删除数据
    • POST 添加数据
  • RESTful Web Services 平台独立、低耦合、自包含、基于可编辑的Web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序。
  • 获取用户列表: RESTful API listUsers。用于读取用户的信息列表
  • 添加用户: RESTful API addUser。用于添加新的用户数据
  • 显示用户详情: RESTful API :id(用户id)。 用于读取指定用户的详细信息
  • 删除用户: RESTful API deleteUser。 用于删除指定用户的详细信息