<了不起的NODEJS>学习笔记

一、 Chapter1
package.json
{
"names":"my-colors-project",
"version":"0.0.1",
"main":"./index".
"dependencies":{
"colors":"0.5.0"
}
}

如果不想暴露API,在package.json加入"private":true.
察看package.json所有的属性
npm help json

安装时加上-g 表示全局,.分发的是Node编写的命令行工具.
npm install -g express
npm search realtime //搜索npm仓库的模块
npm view socket.io// 查看模块
npm help -publish //如何发布模块帮助

二、 JS概览
var a={a:'b',c:"d"};
Object.keys(a); // 输出 ['a','c']
Array,.isArray();// 判断是否数组类型
[1,2,3].foreach(function (v) {
console.log(v);
});
__defineGetter__ 访问属性
__defineSetter__ 定义属性



三、 阻塞与非阻塞IO
Node是单线程的。
错误捕捉很重要,
process.on("uncaughtException", function (err) {
console.error(err);
process.exit(1); // 手动退出
});

要捕获一个未来才会执行到的函数所抛出的错误时不可能的。并且catch永远都不会被执行到
try {
setTimeout(function () {
throw new Error("here");
});
} catch (e) {
console.error(e); //不会执行到
}



四、 Node中的JS
全局对象:global,process
process.title
process.nextTick 可以将一个函数的执行时间规划到下一个事件循环中(相当于setImmediate)

模块系统有三个核心的全局对象:require、module、exports

绝对和相对模块:
绝对模块是指在其内部node_modules查找到的模块。或者node内置的如fs的模块
相对模块将require指向一个相对工作目录中的js文件。


五、 Cli,filesystem
验证package.json.json有无问题,在当前目录下运行npm install,无任何输出(ERROR,warn没关系)就是正常的。

console.log(process.argv);
输出[node,'/path','param'];// node和当前执行的文件路径,最后一个是参数

process.cwd 获取当前工作目录

process.chdir('/') 更改工作目录

process.env // shell环境下的变量
process.exit(1); // 退出
process.on('SIGKILL', function () {
// 收到信号
});

fs.createReadStream();
fs.watchFile(process.cwd() . "/" + file , function () {
console.log("file change");
} )

fs.watch();// 监视整个目录

六、 TCP
nodejs有两个和连接终止有关的事件:end和close
当客户端显示关闭TCP时触发end事件
当连接发生错误时,end事件不会触发,而是触发close事件



七、 HTTP
console.log(require('querystring').parse('name=Guillermo'));
console.log(require('querystring').parse('q=guillermo+rauch'));

querystring将字符串解析成一个对象.输出:
{ name: 'Guillermo' }
{ q: 'guillermo rauch' }

八、 Connect
URL挂载 让my-images和/images目录对应起来
server.use("/my-images", connect.static("/path/to/images"));

maxAge 一个资源在客户端缓存的时间
server.use("/js", connect.static("/path/to/bundle", {maxAge:1000000000}));

hidden:若=true,在UNIXwenjian系统中.开头的文件被认为是隐藏文件
server.use("/js", connect.static("/path/to/resources", {hidden:true}));

looger 中间件提供了四种日志格式
default
dev
short
tiny

server.use(connect.logger("dev"));

在node中,请求响应头都是小写的
body parser中间件

server.use(connect.bodyParser());

server.use(function (req,res) {
req.body.myinput
});

node 的session是保存在内存中的,重起node服务器会丢失.使用redis可持久化session

basicAuth中间件提供client 身份验证的功能.

九、 Express
EJS:模板 module,embedded js

express模板缓存
app.configure('production', function () {
app.enable('view cache');
});

app.set("view cache", true);

大小写路由敏感设置
app.set("/my/route", function (req, res){});

十、 websocket
HTTP 实现鼠标检测的缺点
1 请求顺序会乱.(通过sending状态,当请求一个时设置sending=false,成功返回后设置为true.但是依然无法根本解决,因为等待会耗时,且滞留(丢失)了延迟这段时间内的请求)
2 请求的消息header很多无关数据.而有效的数据只占很小一部分.浪费资源
因此,用TCP比HTTP更合适这类需求

WEBSOCKET也是建立在HTTP基础上的.

十一、 socket.io
当邦定到http.server后,所有以/socket.io开始的URL都会被拦截.
socket.io还自带了浏览器端运用的代码.

十二、 mongodb

十三、 msyql
node 0.6 开始可以直接使用require 引入json文件
var config = require("./config");


十四、 redis
十五、 代码共享

// 初始化module
(function (module) {
module.exports = function (a,b) {
return a +b;
}

if ('undefined' != typeof window) {
window.add = module.exports;
}
})(('undefined' == typeof module) ? module = {exports:{}} : module);



es5-shim的项目将所有浏览器缺少的ECMA标准api都实现了.优点是不需要修改原代码.缺点是,破坏了原型对象.影响其他使用者

另外一种解决方法是定义简单的函数,接收原生对象作为参数。,如果该对象的函数已经实现就直接使用 ,否则就实现一次。缺点是:我们要记的是工具函数而不是原生函数。而且有些工具函数会很长,很复杂。而且为了兼容旧款IE,要写出兼容的代码,会比较冗长。

例如 Object.keys
var keys= Object.keys || function (obj) {
var ret = [];
for(var i in obj) {
if (Object.prototype.hasOwnProperty.calll(obj,j)) {
ret.push(i);
}
}
}


Node社区写了兼容所有运行环境的Node API

十六、 测试
node自带了assert模块..

猜你喜欢

转载自lhdst-163-com.iteye.com/blog/2219491