node学习的基本知识(参考《NodeJs深入浅出》)

来源:互联网 发布:淘宝网买东西的步骤 编辑:程序博客网 时间:2024/06/05 08:41
Node.js 是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应、超大规模数据要求下架构的可扩展性。这使得它摒弃了传统平台依靠多线 程来实现高并发的设计思路,而采用了单线程、异步式I/O、事件驱动式的程序设计模型。这些特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,进而提高了开发效率。

V8是世界上最快的javascript引擎

node内建http服务器,内部是用 C++ 实现的,外部用 JavaScript 封装

Node.js 大的特点就是采用异步式 I/O 与事件驱动的架构设计

db.query('SELECT * from some_table', function(res) { res.output(); });
这段代码中 db.query 的第二个参数是一个函数,我们称为回调函数。进程在执行到 db.query 的时候,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。 当数据库查询结果返回时,会将事件发送到事件队列,等到线程进入事件循环以后,才会调用之前的回调函数继续执行后面的逻辑。

Node.js 的异步机制是基于事件的,所有的磁盘 I/O、网络通信、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理

使用了高效的 libev 和 libeio 库支持事件驱动和异步式 I/O。

CommonJS 规范包括了模块(modules)、包(packages)、系统(system)、二进制(binary)、 控制台(console)、编码(encodings)、文件系统(filesystems)、套接字(sockets)、单元测 试(unit testing)等部分。

同步式 I/O 和异步式 I/O 的特点
同步式 I/O(阻塞式) 异步式 I/O(非阻塞式)
利用多线程提供吞吐量 单线程即可实现高吞吐量
通过事件片分割和线程调度利用多核CPU 通过功能划分利用多核CPU
需要由操作系统调度多线程使用多核 CPU 可以将单进程绑定到单核 CPU
难以充分利用 CPU 资源 可以充分利用 CPU 资源
内存轨迹大,数据局部性弱 内存轨迹小,数据局部性强
符合线性的编程思维 不符合传统编程思维

Node.js 程序由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数,所以 Node.js 始终在事件循环中,程序入口就是事件循环第一个事件的回调函数。事件的回调函数在执行的过程中,可能会发出 I/O 请求或 直接发射(emit)事件,执行完毕后再返回事件循环,事件循环会检查事件队列中有没有未 处理的事件,直到程序结束。

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的exports对象。

Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 index.js 或 index.node 作为包的接口。

npm 提供了一个有趣的命令 npm link,它的功能是在本地包和全局包之间创建符号链接。我们说过使用全局模式安装的包不能直接通过 require 使用,但通过 npm link命令 可以打破这一限制。npm link命令还可以将本地的包链接到全局。 使用方法是在包目录( package.json 所在目录)中运行 npm link 命令。如果我们要开发 一个包,利用这种方法可以非常方便地在不同的工程间进行测试 但是npm link 命令不支持 Windows

node调试:
1.命令行
2.远程
3.eclipse
4.node-inspector

在浏览器 JavaScript中,通常 window 是全局对象,而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是global对象的属性。

读取文件内容有两种方式:
异步: fs.readFile(filename,[encoding],[callback(err,data)])
callback提供两个参数err和data,如果没有指定编码方式,data就是以buffer形式表示的二进制数据。 .toString() 可将二进制变为十进制
如果没有发生错误,err 的值会是 null 或 undefined。如果有错误发生,err 通常是 Error 对象的实例
同步: fs.readFileSync(filename,[encoding])
而读取到的文件内容会以函数返回值的形式返回。如果有错 误发生,fs 将会抛出异常,你需要使用 try 和 catch 捕捉并处理异常

fs.open(path, flags, [mode], [callback(err, fd)]) path为文件路径,flags为打开方式
fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead, buffer)])
从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。offset 是 buffer 的写入偏移量。length 是要从文件中读取的字节数。position 是文件读取的起始 位置,如果 position 的值为 null,则会从当前文件指针的位置读取。回调函数传递 bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象
fs.open和fs.read不建议这么使用。为它要求你手动管理缓冲区 和文件指针,尤其是在你不知道文件大小的时候,这将会是一件很麻烦的事情

HTTP 请求一般可以分为两部分:请求头(Request Header)和请求体(Requset Body)。
以上内容由于长度较短都可以在请求头解析完成后立即读取。而请求体可能相对较长, 需要一定的时间传输,因此 http.ServerRequest 提供了以下3个事件用于控制请求体传输。
data :当请求体数据到来时,该事件被触发。该事件提供一个参数 chunk,表示接收到的数据。如果该事件没有被监听,那么请求体将会被抛弃。该事件可能会被调用多次。
end :当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
close: 用户当前请求结束时,该事件被触发。不同于end,如果用户强制终止了传输,也还是调用close。

GET与POST
Get:把所有内容编码到访问路径中。通过 url.parse,原始的 path 被解析为一个对象,其中 query 就是我们所谓的 GET 请求的内容,而路径则是 pathname
POST:

HTTP服务器与http客户端
http客户端:
http.request(options,callback) 发起请求 返回一个http.ClientRequest的实例
http.get(options,callback) 处理get请求 返回一个http.ClientRequest的实例

MVC结构
模型、视图和控制器。
模型是对象及其数据结构的实现,通常包含数据库操作。
视图表示用户界面,在网站中通常就是 HTML 的组织结构。
控制器用于处理用户请求和数据流、复杂模型,将输出传递给视图。

Express 除了为 http 模块提供了更高层的接口外,还实现了 许多功能,其中包括: 路由控制; 模板解析支持; 动态视图; 用户会话; CSRF 保护; 静态文件服务; 错误控制器; 访问日志;缓存; 插件支持。
模板引擎的功能是将页面模板和要显示的数据结合起来生成 HTML 页面。它既可以运行在服务器端又可以运行在客户端,大多数时候它都在服务器端直接被解析为 HTML,解析 完成后再传输给客户端,因此客户端甚至无法判断页面是否是模板引擎生成的。在 MVC 架构中,模板引擎包含在服务器端。控制器得到用户请求后,从模型获取数据,调用模板引擎。模板引擎以数据和页面模板为输入,生成 HTML 页面,然后返回给控制器, 由控制器交回客户端

layout.ejs 是一个页面布局模板,它描述了整个页面的框架结构,默认情况下每个单独的 页面都继承自这个框架,替换掉 <%- body %> 部分。这个功能通常非常有用,因为一般为 了保持整个网站的一致风格,HTML 页面的<head>部分以及页眉页脚中的大量内容是重复 的,因此我们可以把它们放在 layout.ejs 中。

会话:session
会话是一种持久的网络协议,用于完成服务器和客户端之间的一些交互行为。
为了在无状态的 HTTP 协议之上实现会话,Cookie 诞生了。浏览器首次向服务器发起请求时,服务器生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,以后每次再发起请求,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。
req.body 就是 POST 请求信息解析过后的对象,例如我们要访问用户传递的 password 域的值,只需访问 req.body['password'] 即可。
req.flash 是 Express 提供的一个奇妙的工具,通过它保存的变量只会在用户当前和下一次的请求中被访问,之后会被清除,通过它我们可以很方便地实现页面的通知和错误信息显示功能。
res.redirect是重定向功能,通过它会向用户返回一个303See Other状态,通知浏览器转向相应页面。
crypto 是 Node.js 的一个核心模块,功能是加密并生成各种散列,使用它之前首先要声明 var crypto = require('crypto')。我们代码中使用它计算了密码的散列值。
User 是我们设计的用户对象,在后面我们会详细介绍,这里先假设它的接口都是可用的,使用前需要通过 var User = require('../models/user.js') 引用。
User.get 的功能是通过用户名获取已知用户,在这里我们判断用户名是否已经存在。User.save 可以将用户对象的修改写入数据库。
通过 req.session.user = newUser 向会话对象写入了当前用户的信息,在后面我们会通过它判断用户是否已经登录。

阅读全文
0 0
原创粉丝点击