分类「后端」(共 5 篇文章)

Node.js 中的很多核心模块,都是基于事件来实现的。一些对象通过触发一些事件,使得相应的监听器函数能够被调用执行。所有能够触发事件的对象都是 EventEmitter 类的实例。这些对象可以通过 eventEmitter.on() 方法,将多个函数附加到由这个对象触发的对应命名事件中。当 EventEmitter 对象触发一个事件时,所有附着在那个事件上的函数都会被同步调用。

下面的例子展示了一个简单的 EventEmitter 实例,其中包含一个单独的监听器。eventEmitter.on() 方法用来注册监听器, eventEmitter.emit() 方法用来触发相应的事件。

一般不会直接使用 EventEmitter 作为构造实例的对象,而是会通过继承来自定义一个 EventEmitter,使用方式如下:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

// 允许对同一事件添加多个监听器函数,
// 也允许通过事件来传递多个参数:
myEmitter.on('event', (a, b, c) => {
    // Something
})
myEmitter.emit('event', 'a', 'b', 'c');

在 TypedArray (ES6) 之前,JavaScript 语言还不能直接从二进制数据流中读取数据。Buffer 模块就被用来作为 Node 的核心 API,负责一些如 TCP 流和文件操作的功能。

在 ES6 的 TypedArray 出现后,Buffer 模块也继承了 Uint8Array,并且让它更适用于 Node.js 的场景。

Buffer 模块是 Node.js 中的全局对象,所以不需要像其它模块那样通过 require('buffer').Buffer 这样来导入 Buffer 模块,直接就能作为已存在的全局对象够使用。

Buffer 的实例与整数数组很相似,但是却有着固定的长度,一旦被创建就不能够改变大小。Buffer 在内存分配的位置上也有所不同,它并不是被 V8 分配在堆上,所以不存在受到 V8 内存限制的问题。它是由 Node 的 C++ 层面上来实现对内存的申请的,然后通过 JavaScript 来对内存进行分配。

在浏览器中,顶级作用域就是全局作用域。也就是说在全局作用域中通过 var something 会定义一个全局可访问的变量,这个变量会附加到全局对象 window 成为它的一个属性。

Node.js 采用 CommonJS 模块加载机制,一个文件对应一个模块。顶级作用域并不是全局作用域,而是模块作用域。在一个模块被加载前,会被 Node.js 使用一个匿名函数包裹:

(function (exports, require, module, __filename, __dirname) {
    // 模块文件的代码
})

因为有了这一个匿名函数的存在,而函数内部具有单独的作用域,因而有了模块作用域一说,这也是 Node.js 不同于浏览器的一点。

现今的 Web 服务器端应用,几乎所有的请求都牵扯到数据库的读写。可以说,对数据库的操作是服务器端应用的核心。特别是一些类信息管理系统,完全是针对数据库中的海量数据处理而开发的。数据库的 CRUD(Create, Retrieve, Update, Delete)便成了如今服务器开发的重中之重,往往成为软件项目开发中最耗费时间也是最多 BUG 的一项任务了。

而 CRUD 的实现往往涉及到大量的 SQL 语句的编写,分别对不同的请求执行不同的 SQL 语句,数据库复杂的话,这便成了一项浩大的工程。除此之外,若只是使用较为原始的 JDBC 进行查询的话,数据库中查询的数据是以结果集类型返回的,还需要进一步地处理转换成 Map、List 或是 JavaBean 类型。而开发完成之后的维护及更新,则更让人抓狂。可以说,在大型项目的开发之中,只是单纯的使用 JDBC 几乎已经成为了不可能的事,必须使用一些持久层框架来完成这项工程。

在 PHP 较为熟练地掌握之后,我开始了 JavaWeb 的学习,到现在已经开始使用 Spring 框架进行项目开发了。大多数人的 JavaWeb 都是从 JSP 学起的,这对于了解 HTML 的人来说入门较为方便,能由浅入深地进入 JavaWeb。而我认为这样的学习不是最好的方式,应该从 JSP 的底层——Servlet 学起。

事实上,所有的 JSP 页面在部署运行时,都是先被 JSP 容器翻译成 Servlet 这类 Java 文件,然后再由 JDK 编译成 class 二进制文件运行的。由此而言,首先掌握 JSP 的实质才是更重要的。这里我就不对 JSP 和 Servlet 做过多介绍,说说 Spring 这个 JavaWeb 框架。

Copyright © 2017 dremy.cn
皖ICP备16015002号