第一章 Node.js简介 第二章 安装和配置Node.js
1、Node.js是一个让Javascript运行在服务端的开发平台。
2、Node.js中所谓的Javascript只是Core Javascript.不包含DOM、BOM或者ClientJavascript。
3、Node.js的Javascript引擎V8,是号称世界上最快的Javascript引擎。它的JIT(Just-in-time compilation即时编译)执行速度接近本地。
4、Node.js内建了HTTP服务器支持。
5、Node.js最大的特点是采用 异步式I/O与事件驱动的架构设计。
6、RingoJS基于Rhino实现类似服务端Javascript平台。CouchDB,MongoDB新型非关系型数据库。ECMAScript浏览器端Javascript规范,CommonJS规范是服务器端Javascript规范。
第三章 Node.js快速入门
1、node script.js node -e 'console.log("hello world");'要执行的语句作为node -e参数
2、REPL(Read-eval-print loop)模式即输入-求职-输出循环 ctrl+c 两次退出
3、npm install -g supervisor,supervisor可以帮助你实现监视你的代码改动,自动重启nodejs。
4、线程在执行中如果遇到磁盘读写或网络通信(统称I/O操作),通常要耗费较长时间,这时操作系统会剥夺这个线程的CPu控制权,使其暂停执行,同时将资源让给其他工作线程,这种线程调用方式称为阻塞。
异步式I/O或非阻塞式I/O则针对所有I/O操作不采用阻塞的策略。遇到I/O操作时,不阻塞,而是将请求发送到操作系统,继续执行下一条语句。当系统完成I/O操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时间处理这个事件。
5、
var http = require('http'); http.createServer(function(require, response) { response.writeHead(200, {'Content-Type': 'text/html'}); response.write('Node.js
'); response.end('Hello
'); }).listen(80);
6、
var fs = require('fs'); fs.readFile('file.txt', 'utf-8', function(err, data){ if(err) { console.log(err); }else{ console.log(data); } });
var fs = require('fs'); var data = fs.readFileSync('file.txt', 'utf-8'); console.log(data); console.log('end');
7、Node.js所有的操作完成时都会发送一个事件到事件队列。在开发者看来,事件由EventEmitter对象提供。
8、模块。
//module.js exports.sayHello = function() { console.log('hello'); }
或 function sayhi() {} module.exports = sayhi; //getmodule.js var myModule = require('./module'); myModule.sayHello();
9、
//package/index.js exports.hello = function(){ console.log('hello.'); } //getpackage.js var SomePackage = require('./package'); SomePackage.hello();
11、
12、npm link命令可以打破全局模式安装的包不能直接通过require使用这个限制。
npm install -g express 后在工程的目录下运行命令:npm link express就可以把他当成本地包使用了。
13、包的发布:npm adduser创建账号。npm whoami测试是否取得账号。然后使用npm publish就发发布了。打开search.npmjs.org可以找到刚刚发布的包。
14、执行node debug debug.js启动调试工具。n 单步执行
c 直到遇到下一个断点
s 单步并进入函数。
15、npm install -g mode-inspector安装node-inspector,node --debug-brk=5858 debug.js
然后在启动node-inspector:node-inspector。 在浏览器中打开local:8080/debug?port=5858就可以看到web调试工具。
第四章 Node.js核心模块
1、在浏览器Javascript中,window是全局对象;Node.js中,全局对象时global。console,process等都是global的属性。
2、process是一个全局变量,即global对象的属性,描述当前Node.js进程状态的对象,提供了一个与操作系统的简单接口。
process.argv是命令行参数数组,日一个元素是node,第二个是脚本文件名,从第三个元素开始每个元素是一个运行参数。
process.stdout标准输出流,console.log()向标准输出打印字符,而process.stdout.write()函数提供了更底层的接口。
process.stdin是标准输入流,初始时被暂停,要想从标准输入读取数据,你必须恢复流,并手动编写流的事件响应函数。
process.nextTick(callback)为事件循环设置一项任务,Node.js会在下次事件循环响应时调用callback。
3、util.inherits(Sub, Base);//一个实现对象间原型继承的函数
util.inspect(person );将任意对象转换成字符串的方法。
4、events模块只提供一个对象:events.EventEmitter。
EventEmitter.on(event, listener); EventEmitter.emit(event, [arg1], [..])
EventEmitter.once(event, listener) EventEmitter.removeListener(event, listener) EventEmitter.removeAllListeners([event]);
5、fs.readFile js.readFileSync fs.open fs.read();//比fs.readFile提供更底层的接口
6、http.Server是一个基于事件的HTTP服务器,它的核心由Node.js下层C++部分实现。接口由Javascript封装。
提供以下几个事件:request,connection,close
http.ServerRequest是HTTP请求信息,三个事件:data,end,close. 简称request或req。
7、获取GET请求内容。由于GET请求直接嵌入到路径中,URL是完整的请求路径,包括?后面部分。因此可以手动解析后面的内容作为GET请求的参数。res.end(util.inspect(url.parse(req.url,true)));
获取POST请求内容:Node.js默认不会解析请求体的,需要的时候,手动解析。
var post = ''; req.on('data', function(chunk) {post += chunk;}); post = querystring.parse(post);
8、http.ServerResponse三个重要成员函数:response.writeHead(statusCode,[headers]);
response.write(data,[encoding]) response.end([data], [encoding]);
8、HTTP客服端。http.request, http.get 是http模块提供的作为客服端向HTTP服务器发起请求。
http.ClientRequest 是由http.request或http.get返回产生的对象,表示一个已经产生而且正在进行中的HTTP请求。
http.ClientRequset像http.ServerResponse一样提供了write和end函数,用于想服务器发送请求体,结束一定要用end。
http.ClientResponse与http.ServerRequest相似,提供data,end,close三个事件。
第五章 使用Node.js进行web开发
1、安装npm install -g express.建立工程: express -t ejs microblog.(在这之前可以express -e,安装ejs) cd microblog ; npm install
2、
//test.js var express = require('express') ... var app = express();
app.configure(function(){ app.set('port', process.env.PORT || 3000);
app.use(express.bodyParser()); ... }); app.get('/', routes.index);//express的REST风格路由控制。Representational State Transfer表征状态转移 ... http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); });
//Express模板的index.js类型。
//router.js
exports.hello = function(req, res) { res.send('The time is ' + new Date().toString()); };
3、当你当问任何被两条同样的规则匹配到的路径时,会发现请求总是被前一条路由规则捕获,后面的规则会被忽略。原因是express在处理路由规则时,会优先匹配先定义的路由规则,后面的相同的规则被屏蔽。
4、使用模板引擎、app.set('views, _dirname + '/views');
app.set('view engine', 'ejs');
res.render('index', { title: 'Express' });
//index.ejs
<%= title %>
welcome to <%= title %>
5、片段视图。
在express 3.x Partial被移除了,用include代替。如:
//list.ejs
<% include listitem %> body>
//listitem.ejs
6、Express提供了一个叫做“视图助手”的工具,它的功能是允许在视图中访问一个全局的函数或对象,不用每次调用视图解析时都单独传入。前面的partial就是一个视图助手。
分为静态视图助手和动态视图助手。差别在于静态可以使任何类型对象,包括任意参数函数,但访问到的对象必须是与用户请求无关的。
动态视图助手只能是一个函数,这个函数不能接受参数,但可以访问req和res对象。