Node.js 入门教程 第二讲 常见的全局对象

全局对象列表

使用util工具模块提供的inspect方法可以遍历出 global 全局变量中所存在的对象与方法

var util = require("util");
console.log(util.inspect(global, true, 0));

输出结果(已排序)

{ 
    // global自身
    root                 : [Circular],
    global               : [Circular],
    GLOBAL               : [Circular],

    // node 內置对象
    console              : [Getter],  // 控制台对象
    process              : [Object],  // 进程对象
    Buffer               : [Object],  // 缓冲对象 (不满纯js的ArrayBuffer?)

    // 基础对象
    [Object]             : [Object],  // Object 对象
    [Function]           : [Object],  // Function 对象
    [Date]               : [Object],  // 日期对象
    [Number]             : [Object],  // 数字对象对象
    [String]             : [Object],  // 字符串对象
    [Array]              : [Object],  // 数组对象
    [Boolean]            : [Object],  // 布尔对象对象
    [Math]               : [Object],  // Math 对象
    [RegExp]             : [Object],  // RegExp 正则对象
    [JSON]               : [Object],  // json 对象
    [eval]               : [Object],  // eval 对象

    // 类型化数组                     //  字节      描述                C语言描述
    Int8Array            : [Object],  //   1   8位有符号整数           signed char
    Uint8Array           : [Object],  //   1   8位无符号整数           unsigned char
    Uint8ClampedArray    : [Object],  //   1   8位无符号整数 (clamped) unsigned char
    Int16Array           : [Object],  //   2   16位有符号整数          short
    Uint16Array          : [Object],  //   2   16位无符号整数          unsigned short
    Int32Array           : [Object],  //   4   32位有符号整数          int
    Uint32Array          : [Object],  //   4   32位无符号整数          unsigned int
    Float32Array         : [Object],  //   4   32位IEEE浮点数          float
    Float64Array         : [Object],  //   8   64位IEEE浮点数          double
    ArrayBuffer          : [Object],  // 二进制数据的原始缓冲区
    DataView             : [Object],  // 可用在 ArrayBuffer 中的任何位置读写入不同类型的数据

    // 錯誤對象
    [Error]              : [Object],  // 错误错误
    [EvalError]          : [Object],  // Eval 错误
    [TypeError]          : [Object],  // Type 错误
    [URIError]           : [Object],  // URI 错误
    [RangeError]         : [Object],  // Range 错误
    [ReferenceError]     : [Object],  // Reference 错误
    [SyntaxError]        : [Object],  // Syntax 错误

    // 类型判断
    [NaN]                : NaN,       // not a number 不是一個数字
    [Infinity]           : Infinity,  // 正无穷大
    [isFinite]           : [Object],  // 判断是否为正无穷大
    [undefined]          : undefined  // 未定义
    [isNaN]              : [Object],  // 判断是否为未定义 

    // 定时延时对象
    setInterval          : [Object],  // 设置定时器
    clearInterval        : [Object],  // 清除定时器
    setTimeout           : [Object],  // 设置延迟执行
    clearTimeout         : [Object],  // 清除延迟执行
    setImmediate         : [Object],  // 设置延迟执行(更快更兼容)
    clearImmediate       : [Object],  // 清除延迟执行

    // 编码
    [decodeURI]          : [Object],  // 解码某个编码的 URI
    [decodeURIComponent] : [Object],  // 解码一个编码的 URI 组件
    [encodeURI]          : [Object],  // 把字符串编码为 URI
    [encodeURIComponent] : [Object],  // 把字符串编码为 URI 组件
    [escape]             : [Object],  // 对字符串进行编码
    [unescape]           : [Object],  // 对由 escape() 编码的字符串进行解码
    [parseInt]           : [Object],  // 解析一个字符串并返回一个整数
    [parseFloat]         : [Object],  // 解析一个字符串并返回一个浮点数

    // node 内置对象(请先无视)
    COUNTER_HTTP_SERVER_REQUEST        : [Object],
    COUNTER_HTTP_SERVER_RESPONSE       : [Object],
    COUNTER_HTTP_CLIENT_REQUEST        : [Object],
    COUNTER_HTTP_CLIENT_RESPONSE       : [Object],
    COUNTER_NET_SERVER_CONNECTION      : [Object],
    COUNTER_NET_SERVER_CONNECTION_CLOSE: [Object],
    DTRACE_HTTP_CLIENT_REQUEST         : [Object],
    DTRACE_HTTP_SERVER_REQUEST         : [Object],
    DTRACE_HTTP_CLIENT_RESPONSE        : [Object],
    DTRACE_HTTP_SERVER_RESPONSE        : [Object],
    DTRACE_NET_SERVER_CONNECTION       : [Object],
    DTRACE_NET_STREAM_END              : [Object],
    DTRACE_NET_SOCKET_WRITE            : [Object],
    DTRACE_NET_SOCKET_READ             : [Object],
}

Circular 可以理解为递归到自己

大家也可以去看w3school 上的 JavaScript 全局对象参考手册 来对比 浏览器上的 js 与 node 上 js 全局对象的一些区别

global 对象

global 为全局命名空间对象,不过需要注意的是,这个全局只是针对当前文件本身。

console 对象

console.log(“hello node.js”)
for(var i in console){
console.log(i+” “+console[i])
}

var log = function () {
process.stdout.write(format.apply(this, arguments) + ‘n’);
}
var info = function () {
process.stdout.write(format.apply(this, arguments) + ‘n’);
}
var warn = function () {
writeError(format.apply(this, arguments) + ‘n’);
}
var error = function () {
writeError(format.apply(this, arguments) + ‘n’);
}
var dir = function (object) {
var util = require(‘util’);
process.stdout.write(util.inspect(object) + ‘n’);
}
var time = function (label) {
times[label] = Date.now();
}
var timeEnd = function (label) {
var duration = Date.now() – times[label];
exports.log(‘undefined: NaNms’, label, duration);
}
var trace = function (label) {
// TODO probably can to do this better with V8’s debug object once that is
// exposed.
var err = new Error;
err.name = ‘Trace’;
err.message = label || ”;
Error.captureStackTrace(err, arguments.callee);
console.error(err.stack);
}
var assert = function (expression) {
if (!expression) {
var arr = Array.prototype.slice.call(arguments, 1);
require(‘assert’).ok(false, format.apply(this, arr));
}
}

process 对象

buffer 对象

module 对象

for(var i in module){
console.log(“var ” + i + ” = “+module[i])
}

var id = .
var exports = [object Object]
var parent = null
var filename = /home/cheng19840218/node/example.js
var loaded = false
var exited = false
var children =
var paths = /home/cheng19840218/node/node_modules,/home/cheng19840218/node_modules,/home/node_modules,/node_modules
var load = function (filename) {
//太长了,省略
}
var _compile = function (content, filename) {
//太长了,省略
}

原来那个著名的exports是在此提供的,__filename大概也是filename的引用。只要遍历一下,你就发现许多有趣的东西。但别以为一下秘密就暴光在你眼皮下,还有许多不可遍历属性。比如上面我遍历global对象,只有尞尞可数几个成员,我们可以使用ecma262v5新增的方法去考察一下:

console.log(Object.getOwnPropertyNames(global))

许多人学node.js就立即看其文档,殊不知node.js本身所依赖的V8引擎就拥有许多要学的东西,这其中包括ecma262v5带来的新方法新对象,还有效仿firefox的一些语法:

__defineGetter__
__defineSetter__
__lookupGetter__
__lookupSetter__
set
get
__proto__

好了,我们来点实质的内容吧。node.js本来就是一个http服务器,它是要与前端交互的,因此少不了两个对象:请求(request)与响应(response)。请求与响应显然一种异步的东西,因为我们 不知道前端什么时候发请求过来,响应也不能立即给前端,还要做日志,读写数据库等操作呢。因此对于javascript来说,这用回调函数来实现最好。那么由誰来接受这个回调呢?一个服务器对象!

var http = require(“http”);
http.createServer(function(request, response) {
response.writeHead(200, {“Content-Type”: “text/plain”});
response.write(“Hello node.js”);
response.end();
}).listen(8888);
node.js有个特殊的require,用于同步加载其他模块的对象,这与其他语言的require, import差不多。能同步就是好,不像前端那样一层套一层。然后利用一个函数去实例化一个服务器对象,然后监听8888端口。这是node.js官网最初的例子,大家都写烂了。但这样的程序在现实中一无是处,我们在地址栏上输入URL,你起码要返回一个完整页面给我吧!

对此,我们首先要进行模块化。模块化是以文件为单位的,把example.js更名为server.js,然后再把里面的内容改为一个模块。对于一个node.js的文件,其实它里面的内容是在一个封闭的环境中执行。要想共享给其他模块使用,就必须绑定在exports对象上。

var http = require(“http”);

exports.start = function(){
http.createServer(function(request, response) {
console.log(“Request received…”);
response.writeHead(200, {“Content-Type”: “text/plain”});
response.write(“Hello node.js”);
response.end();
}).listen(8888);
console.log(“server start…”);
}
然后我们再建一个index.js作为入口(index.js与server.js放在同一目录下)。

var server = require(“./server”);

server.start();
然后建一个index.html页面。

index

这是首页

现在我们就在要请求过来时,把此页的内容读出来,返给用户。这时我们就要用到fs模块的方法了。

var http = require(“http”);
var fs = require(‘fs’);
exports.start = function(){
http.createServer(function(request, response) {
fs.readFile(‘./index.html’, ‘utf-8’,function (err, data) {//读取内容
if (err) throw err;
response.writeHead(200, {“Content-Type”: “text/html”});//注意这里
response.write(data);
response.end();
});
}).listen(8888);
console.log(“server start…”);
}
好了,这时我们重启再次输入地址,就看到一个完整的页面了。

但一个页面除了HTML结构层外,还有javascript与css。那么,我们在当前目录建一个文件夹javascripts, 里面建index.js,内容如下:

window.onload = function(){
var p = document.createElement(“p”);
p.innerHTML = “这是动态添加的”
document.body.appendChild(p);
}
再建一个styles目录,里面建index.css,内容如下:

html,body{
background: #3671A5;
height: 100%
}
然后在index.html引入这两个文件:

index

/javascripts/index.js

这是首页

重新打开,发现没有改变,google,说要处理js与css文件的请求。没有办法,取得request.url属性,再判定后缀名,为它进行文件读取与设置首部。

var http = require(“http”);
var fs = require(‘fs’);
var url = require(‘url’);
exports.start = function(){
http.createServer(function(request, response) {
var pathname = url.parse(request.url).pathname;
var ext = pathname.match(/(.[^.]+|)$/)[0];//取得后缀名
switch(ext){
case “.css”:
case “.js”:
fs.readFile(“.”+request.url, ‘utf-8’,function (err, data) {//读取内容
if (err) throw err;
response.writeHead(200, {
“Content-Type”: {
“.css”:”text/css”,
“.js”:”application/javascript”,
}[ext]
});
response.write(data);
response.end();
});
break;
default:
fs.readFile(‘./index.html’, ‘utf-8’,function (err, data) {//读取内容
if (err) throw err;
response.writeHead(200, {
“Content-Type”: “text/html”
});
response.write(data);
response.end();
});

}

}).listen(8888);
console.log(“server start…”);
}

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s