node 路由

我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。



因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)确实值得探讨,但这里暂定其为我们的HTTP服务器的功能。



我们需要的所有数据都会包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的 Node.JS 模块,它们分别是 url 和 querystring 模块。



               url.parse(string).query
|
url.parse(string).pathname |
| |
| |
------ ------------------- http://localhost:8888/start?foo=bar&hello=world
--- -----
| |
| |
querystring.parse(queryString)["foo"] |
|
querystring.parse(queryString)["hello"] <!-- more -->


我们的服务器应当知道路由的存在并加以有效利用。我们当然可以通过硬编码的方式将这一依赖项绑定到服务器上,但是其它语言的编程经验告诉我们这会是一件非常痛苦的事,因此我们将使用依赖注入的方式较松散地添加路由模块。



Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。



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



在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。



全局对象与全局变量
global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条 件的变量是全局变量:



在最外层定义的变量;
全局对象的属性;
隐式定义的变量(未定义直接赋值的变量)。
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。需要注 意的是,在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的, 而模块本身不是最外层上下文。



注意: 最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。



__filename
__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。



__dirname
__dirname 表示当前执行脚本所在的目录。



setTimeout(cb, ms)
setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。



返回一个代表定时器的句柄值。



clearTimeout(t)
clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。



setInterval(cb, ms)
setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。



返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。



setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。



console
console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。



Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。



process
process 是一个全局变量,即 global 对象的属性。



它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。通常在你写本地命令行程序的时候,少不了要 和它打交道。



Process 属性
Process 提供了很多有用的属性,便于我们更好的控制系统的交互:



util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心 JavaScript 的功能 过于精简的不足。



使用方法如下:



const util = require(‘util’);



util.callbackify
util.callbackify(original) 将 async 异步函数(或者一个返回值为 Promise 的函数)转换成遵循异常优先的回调风格的函数,例如将 (err, value) => … 回调作为最后一个参数。 在回调函数中,第一个参数为拒绝的原因(如果 Promise 解决,则为 null),第二个参数则是解决的值。



实例
const util = require(‘util’);



async function fn() {
return ‘hello world’;
}
const callbackFunction = util.callbackify(fn);



callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});



util.inherits
util.inherits(constructor, superConstructor) 是一个实现对象间原型继承的函数。



JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同。JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的



注意:Sub 仅仅继承了Base 在原型中定义的函数,而构造函数内部创造的 base 属 性和 sayHello 函数都没有被 Sub 继承。



同时,在原型中定义的属性不会被 console.log 作 为对象的属性输出。



util.inspect
util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。



showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。



depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归 2 层,指定为 null 表示将不限递归层数完整遍历对象。 如果 colors 值为 true,输出格式将会以 ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。



特别要指出的是,util.inspect 并不会简单地直接把对象转换为字符串,即使该对 象定义了 toString 方法也不会调用。



util.isArray(object)
如果给定的参数 “object” 是一个数组返回 true,否则返回 false。



util.isRegExp(object)
如果给定的参数 “object” 是一个正则表达式返回true,否则返回false。



util.isDate(object)
如果给定的参数 “object” 是一个日期返回true,否则返回false。



Node.js 文件系统
Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node 导入文件系统模块(fs)语法如下所示:



var fs = require(“fs”)
异步和同步
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。



异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。



建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。



获取GET请求内容
var params = url.parse(req.url, true).query;
res.write(“网站名:” + params.name);



获取 POST 请求内容
POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。



比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。
// 定义了一个post变量,用于暂存请求体的信息
var post = ‘’;



// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
req.on('data', function(chunk){
post += chunk;
});

// 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
req.on('end', function(){
post = querystring.parse(post);
res.end(util.inspect(post));
});


OS 模块
提供基本的系统操作函数。



Path 模块
提供了处理和转换文件路径的工具。



Net 模块
用于底层的网络通信。提供了服务端和客户端的的操作。



DNS 模块
用于解析域名。



Domain 模块
简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的。



使用 Node 创建 Web 客户端
Node 创建 Web 客户端需要引入 http 模块,创建 client.js 文件,代码如下所示:



实例
var http = require(‘http’);



// 用于请求的选项
var options = {
host: ‘localhost’,
port: ‘8080’,
path: ‘/index.html’

};



// 处理响应的回调函数
var callback = function(response){
// 不断更新数据
var body = ‘’;
response.on(‘data’, function(data) {
body += data;
});



response.on(‘end’, function() {
// 数据接收完成
console.log(body);
});
}
// 向服务端发送请求
var req = http.request(options, callback);
req.end();



Category node