Node.js修改了客户端到服务器端的连接方法,可以同时处理多达几万个用户的客户端连接。在大型综合类服务网站,往往可能在每秒钟内接收到多达上千条数据并且需要将这些数据迅速书写在缓存区中,然后再通过每一个单独的处理从缓存区中取出这些数据并将其写到数据库中。
Node.js中的模块
模块名 | 模块功能 |
---|---|
assert | 为应用程序的单元测试添加断言处理 |
buffer | 用于实现二进制数据的存储与转换 |
child_process | 用于实现子进程的创建与管理 |
console | 用于为控制台输出信息 |
events | 用于为事件处理提供基础类 |
debugger | 用于实现内置调试器来帮助开发者调试应用程序 |
fs | 用于操作文件及文件系统 |
http | 用于实现http服务器端和客户端 |
https | 用于实现https服务器端和客户端 |
net | 用于创建TCP服务器与客户端 |
os | 用于获取操作系统信息 |
path | 用于处理文件路径 |
Node.js中是通过以模块为单位来划分所有功能的,每一个模块为一个JS文件。每一个模块中定义的变量和函数的作用范围也被限定在这个模块之内,要使用exports对象才能传递到外部。
exports.printFoo = function() {
return "foo";
}
Node.js中的交互式运行环境——REPL
在命令行窗口中,输入"node"命令并按下回车键,即可进入REPL运行环境。任何时候,输入表达式并按下回车键后,运行环境均会显示该表达式的执行结果。
将对象赋值给变量后,输入变量名后按回车键,将直接显示该变量所引用对象的各属性名及属性值。
可以通过下划线字符("_")的使用来访问最近使用的表达式
在运行环境中直接运行函数,可以使用.break中途放弃函数的书写,或用(Ctrl+c)组合键。两次组合键即退出系统,或用.exit。.clear方法可清除上下文对象中保存的所有变量和函数
Node.js中的控制台——console对象
使用console对象代表控制台,通过该对象的各种方法向控制台中进行标准输出流与标准错误输出流的输出。
console.log方法用于进行标准输出流的输出(在控制台显示一行字符串)
console.log("%s","hello","Node.js","!");
console.log("%d",10,10.5);
console.log("2+2");
注:在Node.js中,也可以使用console.info方法来代替console.log方法。
console.error方法用于进行标准错误输出流的输出,与console.log使用方法相同。在Node.js中,也可以使用console.warn方法来代替console.error方法。
console.dir方法用于查看一个对象中的内容,并将其输出到控制台中。
console.log("Hello node.js!");
var user = new Object();
user.name = "huangjm";
user.age = "19";
console.dir(user);
console.time方法与console.timeEnd方法用于统计一段代码的执行时间
console.log("Hello node.js!");
console.time("small loop");
for (var i = 0; i < 1000; i++) {
;
}
console.timeEnd("small loop");
console.trace方法用于将当前位置处的栈信息作为标准错误信息进行输出
console.assert方法用于对一个表达式的执行结果进行评估
Node.js中的全局函数和对象
setTimeout函数和clearTimeout函数指定过去多少秒后执行回掉函数
console.log("Hello node.js!");
console.time("small loop");
var testfuntion=function(msg){
console.log(msg);
};
var timer = setTimeout(testfuntion,5000,"Hello node.js!")
console.timeEnd("small loop");
console.log("Hello node.js!");
console.time("small loop");
var testfuntion=function(msg){
console.log(msg);
};
var timer = setTimeout(testfuntion,5000,"Hello node.js!")
clearTimeout(timer); //增加一行
console.timeEnd("small loop");
setInterval函数和cleatInterval函数表示每隔多少秒后执行某个回调函数
console.log("Hello node.js!");
var testfuntion=function(msg){
console.log(msg);
};
var timer = setInterval(testfuntion,5000,"Hello node.js!")
timer.unref方法和timer.ref方法可以取消和恢复回调函数的执行
require函数用来加载模块
var foo = require('./foo.js'); //通过文件路径加载模块
var http = require('http');
注:当使用Node.js中提供的模块时,只需在require函数中指定模块名。
所有脚本文件都是一个模块文件,同时将在命令行窗口中直接运行的命令定义的模块称为应用程序的主模块,可用require.main变量检测是否为主模块。同时在加载模块文件时,将运行该模块文件中的每一行代码。
if (module === require.main) {
console.log('I am the main application');
}
require.resolve函数用于查询模块文件的绝对路径
require.cache对象代表缓存了所有已被加载模块的缓存区,用console.log(require.cache)表达式来查看该缓存区的内容。
__filename(两个_)变量用于获取当前模块文件的完整绝对路径名
__dirname变量用于获取当前模块文件所在目录的完整绝对路径
Node.js中的事件处理机制——EventEmitter类
所有的可能触发事件的对象都是一个继承了EventEmitter类的子类的实例对象,所有与对象的事件处理函数的绑定及解除相关的处理均依靠这些方法的调用来执行:(event代表事件名,listener代表事件处理函数)
方法名与参数 | 描述 |
---|---|
addListener(event,listener) | 对指定事件绑定事件处理函数 |
on(event,listener) | 对指定事件绑定事件处理函数 |
once(event,listener) | 对指定事件指定只执行一次的事件处理函数 |
removeListener(event,listener) | 对指定事件解除事件处理函数 |
removeAllListener([event]) | 对指定事件解除所有事件处理函数 |
setMaxListeners(n) | 指定事件处理函数的最大数量n |
listeners(event) | 获取指定事件的所有事件处理函数 |
emit(event,[arg1],[arg2],[...]) | 手动触发指定事件 |
用createServer方法来创建用于接收HTTP客户端请求并返回响应的HTTP服务器应用程序,第一个参数代表客户端请求对象,第二个参数代表服务器端所做出的响应对象。使用listen方法指定该服务器使用端口及服务器绑定地址,并对端口进行监听。通过响应对象的writeHead方法书写响应头,write方法书写一行代码,end方法输出一行HTML代码并结束响应流。
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'content-type':'text/html'});
res.write('');
res.end('你好\n');
}).listen(7299,"192.168.43.201");
console.log('Server running at here!')
用addListener或on方法对同一个事件绑定多个事件处理函数,once方法只执行一次后立即被解除。
var http = require('http');
var server = http.createServer();
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log("接收到客户端请求。");
}
})
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log(req.url);
}
res.end();
})
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log("发送响应完毕。");
}
})
server.listen(7299,"192.168.43.201");
console.log('Server running at here!');
用removeListener方法和removeAllListener方法解除绑定事件处理函数
var http = require('http');
var server = http.createServer();
var testFunction = function (req,res) {
if (req.url!=="/favicon.ico") {
console.log("发送响应完毕。");
}
};
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log("接收到客户端请求。");
}
})
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log(req.url);
}
res.end();
})
server.on('request',testFunction);
server.removeListener('request',testFunction); //移除
server.listen(7299,"192.168.43.201");
console.log('Server running at here!');
var http = require('http');
var server = http.createServer();
var testFunction = function (req,res) {
if (req.url!=="/favicon.ico") {
console.log("发送响应完毕。");
}
};
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log("接收到客户端请求。");
}
})
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log(req.url);
}
res.end();
})
server.on('request',testFunction);
server.removeAllListeners('request'); //移除全部
server.on('request',function(req,res) {
if (req.url!=="/favicon.ico") {
console.log("you are so great!");
}
res.end();
})
server.listen(7299,"192.168.43.201");
console.log('Server running at here!');
emit方法自定义事件
server.on('randomEvent',function (arg1,arg2,arg3) {
console.log('自定义事件被触发');
console.log(arg1);
console.log(arg2);
console.log(arg3);
});
server.emit('randomEvent','自定义参数1','自定义参数2','自定义参数3');
listenerCount方法获取事件处理函数数量
var events = require('events');
var server = http.createServer();
console.log(events.EventEmitter.listenerCount(server,'request'));
Node.js中的调试器
用node inspect 命令来调试该脚本文件
"c"继续剩余脚本代码的执行
"n"将程序执行到下一句可执行代码之前