nodejs 基础学习笔记

单线程 单进程 非阻塞 事件驱动。

句柄就是函数

事件驱动模型

事件源-》触发事件《-》监听事件程序-》事件处理程序

路径的要求不严格

node的知识点:

1. node的http模块,

var http = require('http');

http.createServer(function(req, res){

  res.writeHeader(200, {'Content-Type': 'text/plain'});         //写入文件头

  res.end('Hello World!');  //浏览器中的输出

}).listen('8888');

2. fs模块的方法

可以读取文件、文件夹,创建删除文件、文件夹,截取文件内容,修改权限、群组等,用的时候再看吧,这里会用到buffer,具体的不清楚呢?

读取文件模块 readFile,readFileAync

var fs = require('fs');

fs.readFile('input.txt', function(err, data){  //异步读取文件

  console.log(data);

})

var data = fs.readFileAync('input.txt');   //同步读取文件

console.log(data);

fs的stream流, createReadStream(),  createWriteStream()

var fs = require('fs');

var data = '';

var readStream = fs.createReadStream('input.txt');  //这个异步执行的, 按顺序放到事件执行队列中

readStream.on('data', function(chunk){

  data += chunk;

})

readStream.on('end', function(){

  console.log(data);

})

readStream.on('error', function(err){

  console.log(err.stack);

})

var writeStream = fs.createWriteStream('input.txt');

writeStream.end();

writeStream.on('finish', function(){

  console.log('写入完成');

})

writeStream.on('error', function(err){

  console.log(err.stack);

})

3. buffer 理解就是一个存储类型,和Array类似,只是可以存储二进制数据,并且可以指定数据格式

4. events 对象,内部只有一个EmitterEvent方法

var events = require('events').EventEmitter;

var eventsEmitter = new events();

eventsEmitter.on('eventName', functionName);

eventsEmitter.addListener('eventName', functionName);  //on 和 addListener效果是一样的

每种方法的添加事件数量默认是10个,如果超过10个会有警告,可以修改这个默认数量

eventsEmitter.setMaxListeners(21);

//删除某个监听函数
eventsEmitter.removeListener('eventName', fnName);
//删除对象上所有的监听函数
eventsEmitter.removeAllListeners();
//删除某类监听函数
eventsEmitter.removeAllListeners('eventName');
//监听的数量
console.log(eventsEmitter.listeners('eventName').length);
console.log(EventEmitter.listenerCount(eventsEmitter, 'eventName'));
 
5. node的模块引入和导出
通过require取得模块,通过exports暴露模块,和es6的语法不同。
exports暴露模块有两种方式,一种直接写
exports.sayHello = function(){
  alert(1);
}
这种导出的是exports,exports上包含定义的方法,使用方式是
var hello = require('./hello.js');  //要是用./表示当前目录下, hello相当于exports
hello.sayHello();
 
一种是module.exports = function SayName(){
  console.log(3);
}
这种导出的是函数本身,使用方法
var say = require('./hello.js');  //名字可以不一致
say();
var say2 = new say();
 
如果一个文件中暴露多个函数或类呢?
 
这里涉及到了文件缓存取,原生模块,文件模块,原生模块缓存区?
这样做的目的是节省内存,防止文件多次被加载
 
 
6. 路由解析 有两个模块,分别是url模块和querystring
                      url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring.parse(queryString)["foo"] | | querystring.parse(queryString)["hello"]
url有实例方法,有类方法,url.parse()是类方法,
var  url = require('url');
var querystring = require('querystring');
var defaultUrl = ' http://localhost:8888/start?foo=bar&hello=world';
var query = url.parse(defaultUrl).query;
var foo = querystring.parse(query)['foo'];
或者
var query = url.parse(defaultUrl, true).query;   //第二个参数是true的,会解析成对象形式{foo: bar, hello: world};
var foo = query.foo;
 
 
 
7. nodejs的全局对象和全局变量
global
__filename ,当前执行文件的绝对路径,包含文件
__dirname, 当前执行文件的绝对路径,不包含文件
setTimeout,clearTimeout,setInterval,clearInterval
console方法
process对象,有属性,方法,可以读取系统参数,增加结束进程等等
 
8. util是nodejs的核心模块,提供常用函数的集合
常用的有
util.inherits(constructor, superConstructor),是一个实现对象间原型继承的方法。只能继承原型上的方法,对象内的属性和方法不能继承。
util.inspect(object,[showHidden],[depth],[colors]),将一个对象转换为字符串的方法,通常用于调试和错误输出。

showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。

depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归2层,指定为 null 表示将不限递归层数完整遍历对象。 如果color 值为 true,输出格式将会以ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。

util.isArray(object),如果给定的参数 "object" 是一个数组返回true,否则返回false。

util.isDate(object),如果给定的参数 "object" 是一个日期返回true,否则返回false。

util.isRegExp(object),如果给定的参数 "object" 是一个正则表达式返回true,否则返回false。

util.isError(object),如果给定的参数 "object" 是一个错误对象返回true,否则返回false。

更多详情可以访问 http://nodejs.org/api/util.html 了解详细内容。

 
9. post和get 请求
get直接取url中的参数,
post监听事件
var http = require('http');
var querystring = require('querystring');
var postHTML = '<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' + '<body>' + '<form method="post">' + '网站名: <input name="name"><br>' + '网站 URL: <input name="url"><br>' + '<input type="submit">' + '</form>' + '</body></html>';
http.createServer(function (req, res) {
  var body = "";
  req.on('data', function (chunk) {
    body += chunk;
  });
  req.on('end', function () {
    // 解析参数
    body = querystring.parse(body);
    // 设置响应头部信息及编码
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
    if(body.name && body.url) {
      // 输出提交的数据
      res.write("网站名:" + body.name); res.write("<br>");
      res.write("网站 URL:" + body.url);
    } else {
      // 输出表单
      res.write(postHTML);
    }
    res.end();
  });
}).listen(3000);
 
10. nodejs工具模块
os模块,提供了一些基本的系统操作函数
var os = require('os');

console.log('操作系统的默认临时文件夹: ', os.tmpdir());
console.log(' CPU 的字节序: ', os.endianness());
console.log('操作系统的主机名: ', os.hostname());
console.log('操作系统名: ', os.type());
console.log('操作系统名: ', os.platform());
console.log('操作系统 CPU 架构: ', os.arch());
console.log('操作系统的发行版本: ', os.release());
console.log('操作系统运行的时间,以秒为单位: ', os.uptime());
console.log('一个包含 1、5、15 分钟平均负载的数组: ', os.loadavg());
console.log('系统内存总量,单位为字节: ', os.totalmem());
console.log('操作系统空闲内存量,单位是字节: ', os.freemem());
console.log('返回一个对象数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象): ', os.cpus());
console.log('获得网络接口列表: ', os.networkInterfaces());

这个有些和nodejs的全局对象process功能重合,只是process的是属性,如process.platform
 
path模块提供了一些用于处理文件路径的小工具,规范化路径,合并路径,转为绝对或相对路径。。
 
net模块,可以创建服务器,创建客户端,有很多网络相关的方法和属性,这个和http有什么区别呢
net建立的是TCP服务器(传输层),http建立的是http服务器(应用层),这个还需要深入了解
 
dns模块,用于解析域名,获取IP地址等
 
domain模块,简化异步代码的异常处理,可以捕捉try catch无法捕获的异常
对于事件捕获异常有add和remove
 
 
web模块指的是http模块,可以写服务器端,也可以写客户端,模拟客户端请求,根据截取的路径请求文件,将文件输出到服务器
 

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。

使用 Express 可以快速地搭建一个完整功能的网站。

Express 框架核心特性:

可以设置中间件来响应 HTTP 请求。

定义了路由表用于执行不同的 HTTP 请求动作。

可以通过向模板传递参数来动态渲染 HTML 页面。

需要结合三个中间件,分别是body-parser, cookie-parser, multer 

body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。

cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。

multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。

http://www.runoob.com/nodejs/nodejs-express-framework.html

express的中间件,数据传递怎么传呢
路由
res.send();
res.render();
res.rediect(); 
错误处理
 
 
restful api 是一种设计风格而不是标准

HTTP 方法
以下为 REST 基本架构的四个方法:
GET - 用于获取数据。

PUT - 用于更新或添加数据。

DELETE - 用于删除数据。

POST - 用于添加数据

 
nodejs的多进程
 
JXcore
 
mysql  和 mongodb
 
node启动服务的话会有个问题,就是每次修改后需要自己手动再起一次,而supervisor是热启动的工具
sudo cnpm install supervisor -g 装到全局,用supervisor service.js  即可
  
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/wenwenli/p/8301975.html