新时期的Node.js入门总结

基础汇总

  1. require引用的文件中不要有内部调用,否则可能有未知隐患(内存泄漏、或者直接崩溃)

  2. Buffer 是Node特有的数据类型(固有属性、不需要require),主要用来处理二进制数据(Buffer通常表现为十六进制的字符串),新Node API Buffer()方法为Deprecated,推荐使用Buffer.form来初始化一个Buffer对象

    buffer.toString([encoding],[start],[end]) buffer 支持编码类型 ASCII Base64 Binary Hex UTF-8 UTF-16LE/UCS-2

    Buffer一个常用的场景就是HTTP的POST请求,例如

    var body = ''

    req.setEncoding('utf-8');

    req.on('data',function(chumk){

    body += chunk;

    })

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

    })

  3. Fill System 是Node中使用最为频繁的模块之一,该模块提供了读写文件的能力,是借助于底层的linuv的C++ API实现的。

    常用API

    readFile writeFile stat

    fs.stat获取文件的状态(可以用来判断文件还是文件夹)

  4. HTTP服务 是Node的核心模块。

    var http = require("http")

    var server = http.createServer(function(req,res){

    // req.url 获取访问的路径

    //req.method 请求方法

    req.on("data",function(chunk){

    }).on("end",function(){

    });

    res.writeHead(200,{'Content-Type':'text/plain',"Content-Length":Buffer.byteLength(body)});

    res.end('Hello Node!!!');//每个HTTP请求的最后都会被调用,当客户端的请求完成后,开发者应该调用该方法结束HTTP请求

    });

    server.on("connection",function(req,res){

    });

    server.on("request",function(req,res){

    })

    server.listen(3000)

    //处理异常

    process.on("uncaughtException",function(){

    })

    // req.headesr 表示head信息

    POST上传文件

    表单类型设置为: enctype="multipart/form-data"

    服务器处理上传文件通常基于stream来实现,这里比较流行的第三方库formidable

    function dealUpload(req,res){

    var form = new formidable.IncomingForm();

    form.eekpExtension = true;

    form.uploadDir =__dirname;

    from.parse(req,function(err,fields.files){

    if(err)throw err;

    console.log(fields);

    console.log(files);

    res.writeHead(200,{"Content-type":'text/plain'});

    res.end('upload finished');

    })

    }

    HTTP 客户端服务

    var http=require("http");

    http.get("http://www.baidu.com",function(res){

    var statusCode = res.statusCode;

    if(statusCode==200){

    res.on("data",function(chunk){

    });

    res.on("end",function(){

    });

    res.on("error",function(e){

    })

    }

    });

    //代理服务器

    var http =require("http");

    var url = require("url");

    http.createServer(function(req,res){

    var url = req.url.substring(1,req.url.length);//去掉最前面的/

    var proxyRequest = http.request(url,function(pres){

    res.writhHead(pres.statusCode,pres.headers);

    pres.on("data",function(data){

    res.write(data);

    });

    pres.on("end",function(){

    res.end();

    })

    });

    req.on("data",function(data){

    proxyRequest.write(data);

    });

    req.on("end",function(){

    proxyReques.end();

    });

    }).listen(8080);

  5. WebSocekt (比较出名的WebSocket模块还有Socket.IO)

    Node 实现WebSocket

    var WebSocketServer = require("ws").Server;

    var wss = new WebScoketServer({port:3304});

    wss.on("connection",function(ws){

    ws.on("message",function(message){

    console.log(message);

    });

    ws.send("Node Hello WebSocket");

    })

  6. Events 在Node中只定义了一个类EventEmitter

    var eventEmitter = require("events");

    var myEmitter = new eventEmitter();

    myEmitter.on("begin",function(){//注册一个begin事件

    console.log("begin");

    });

    myEmitter.emit("begin");//触发begin事件

  7. 多进程服务

    child_process模块中包括很多创建子进程的方法,包括fork、spawn、exec、execFile

    Cluster是Node 0.6之后新增模块(Cluster可以看做是做了封装的child_process模块)

  8. Proces对象是一个全局的对象,每个Node进程都有独立的process对象,该对象中存储了当前的环境变量,也定义了一些事件

    process.getuid();//用户id

    process.argv;//Node的命令行参数列表

    process.pid;//进程id

    process.cwd();//当前目录

    process.versoin;//Node版本

    process.env;//

  9. Timer setTimeout setInterval

  10. nvm

> nvm install version 安装某个版本的node
> 
> nvm use veresion 切换到某个版本
> 
> nvm ls 列出当前安装的所有的Node版本
> 
> let关键字 会创建一个块级作用域
> 
> const变量不可以再被修改
  1. 函数
> 参数可以设置默认值
> 
> function gred(x="a",y="b"){
> 
> }
> 
> Spread运算符(...)展开运算符
> 
> var ab=["ab","cd"]
> 
> gred(..ab);
> 
> 箭头函数(ES6)
> 
> var func= a=>a;等价于
> 
> var func = function(a){
> 
> return a;
> 
> }
> 
> 多个参数
> 
> var func=(a,b)=>{
> 
> console.log(a,b);
> 
> }
  1. Promise 异步处理
> var promis = new Promise(function(resolve.reject){
> 
> //执行相关异步操作
> 
> //resolve(data)
> 
> // reject(err)
> 
> }),then(res=>{}).catch(err=>{});
> 
> promise.all 多个promise需要执行封装为一个
  1. 回调的终点--async/await
> node 7.6.0之后原生支持
> 
> var asyncReadFile = async function(){
> 
> var result1 = await readFile('a.txt');
> 
> var result 2 = await readFile('b.txt');
> 
> console.log(result1);
> 
> console.log(result2);
> 
> }
  1. Koa2 构建web站点
> koa-static 静态文件服务
> 
> koa-router 路由服务
> 
> koa-bodyparse
  1. MongoDB (Mongoose)
> npm install mongoose
> 
> var mongoose = require("mongoose")
> 
> mongoose.connect("mongodb://xxx/test");
> 
> var db = mongose.connection;
> 
> db.on("error",console.error.bind(console.'conection error:'))
> 
> db.on('open'.function(callback){
> 
> })
> 
> var loginSchema = new mongoose.Schema({
> 
> username:String,
> 
> password:String
> 
> })
> 
> var login = db.model("login",loginSchema,"login")//第一个名称是创建实例使用的名称,第二个是表结构参数,第三个是数据库显示的结合的名称不填的话默认是实例名称的复数s
> 
> var user1 = new login({username:"zhang",password:'test'})
> 
> user1.save(function(err){
> 
> if(err) return handleError(err)
> 
> })
  1. Redis
> npm install redis
> 
> var redis = require("redis")
> 
> var client = redis.createClient('6379','127.0.0.1')
> 
> client.on("error",function(error){
> 
> })
> 
> client.on("ready",funciont(){
> 
> })
> 
> client.set("name","zhang",redis.print)
> 
> client.get("name",function(err,reply){
> 
> })
> 
> client.publish('test',"hello,Node")
> 
> client.subscribe('test')
> 
> client.on("message",function(channel,message){
> 
> })
  1. Localtunnel
> localtunnel是一个有名的第三方模块
> 
> localtunnel.me
  1. 爬虫
> robot.txt是爬虫默认规则
> 
> PHelper
> 
> cheerio
> 
> request.js //node第三方的HTTP请求 [https://github.com/request/request](https://github.com/request/request)
> 
> cheerio 网页解析 [https://github.com/cheeriojs/cheerio](https://github.com/cheeriojs/cheerio)
> 
> selenium
> 
> MongoDB存储数据
> 
> Redis消息队列
  1. 测试与调试
> 使用Assert模块
> 
> Jasmine
> 
> Ava.js
> 
> nyc代码覆盖率
> 
> Travis
> 
> node-inspector v8-inspector
  1. package.json
> package.json常用字段
> 
> name项目名称
> 
> verion项目版本号
> 
> scripts项目不同阶段的命令
> 
> version字段说明
> 
> version:完全匹配
> 
> `>`version 大于这个版本
> 
> `>=`version 大于登录这个版本
> 
> ~version 非常接近这个版本
> 
> ^version与这个版本不兼容
> 
> 1.2.x 这个符号1.2.x的版本 x是任意数字
> 
> *或者“” 任何版本都可以
> 
> version1-version2 版本在version1和version2之间(包括version1和version2)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容