您的位置:首页 > Web前端 > Node.js

<了不起的NODEJS>学习笔记

2017-03-28 14:33 696 查看
一、 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模块..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: