Node.js学习笔记(6~8)

155 阅读4分钟

六、Node.js模块系统

模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

引入模块:

var hello = require('./hello');
hello.world();

hello.js文件内容如下:

exports.world = function() {
  console.log('Hello World');
}

对象类型文件:

//hello.js 
function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports = Hello;

引入对象类型文件:

//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 

七、Node.js路由

路由介绍:
我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。
因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)确实值得探讨,但这里暂定其为我们的HTTP服务器的功能。
我们需要的所有数据都会包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的 Node.JS 模块,它们分别是 url 和 querystring 模块。

路由举例

server.js //服务器文件
var http = require("http");//导入http模块
var url = require("url"); //导入url处理模块
function start(route) { function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received."); route(pathname); response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World"); response.end(); } 
http.createServer(onRequest).listen(8888);
console.log("Server has started."); } 
exports.start = start;
index.js //启动文件
var server = require("./server");
var router = require("./router");
server.start(router.route);

八、Node.js全局对象

全局对象简介:
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。
全局变量介绍

  • 在最外层定义的变量;
  • 全局对象的属性;
  • 隐式定义的变量(未定义直接赋值的变量)。
    __filename //当前文件的文件名,为绝对路径
    __dirname //当前文件所在目录,为绝对路径
    var t=setTimeout(function,ms) //全局函数,在ms后执行function
    clearTimeout(t) //清除之前定义的定时器
    var t=setInterval(function,ms) //每隔ms执行function
    clearInterval(t) //清除之前定义的定时器
    process全局对象:
    事件监听: 1 | exit 当进程准备退出时触发。 | | - | ------------------------------------------------------------------------------------------------------------- | | 2 | beforeExit 当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。 | | 3 | uncaughtException 当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。 | | 4 | Signal 事件 当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。

示例如下:

process.on('exit', function(code) {

  // 以下代码永远不会执行
  setTimeout(function() {
    console.log("该代码不会执行");
  }, 0);
  
  console.log('退出码为:', code);
});
console.log("程序执行结束");

process常用属性:

1stdout 标准输出流。
2stderr 标准错误流。
3stdin 标准输入流。
4argv argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数。
5execPath 返回执行当前脚本的 Node 二进制文件的绝对路径。
6execArgv 返回一个数组,成员是命令行下执行脚本时,在Node可执行文件与脚本文件之间的命令行参数。
7env 返回一个对象,成员为当前 shell 的环境变量
8exitCode 进程退出时的代码,如果进程优通过 process.exit() 退出,不需要指定退出码。
9version Node 的版本,比如v0.10.18。
10versions 一个属性,包含了 node 的版本和依赖.
11config 一个包含用来编译当前 node 执行文件的 javascript 配置选项的对象。它与运行 ./configure 脚本生成的 "config.gypi" 文件相同。
12pid 当前进程的进程号。
13title 进程名,默认值为"node",可以自定义该值。
14arch 当前 CPU 的架构:'arm'、'ia32' 或者 'x64'。
15platform 运行程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32'
16mainModule require.main 的备选方法。不同点,如果主模块在运行时改变,require.main可能会继续返回老的模块。可以认为,这两者引用了同一个模块。