基础汇总

  require引用的文件中不要有内部调用,否则可能有未知隐患(内存泄漏、或者直接崩溃)
  Buffer 是Node特有的数据类型(固有属性、不需要require),主要用来处理二进制数据(Buffer通常表现为十六进制的字符串),新Node API Buffer()方法为Deprecated,推荐使用Buffer.form来初始化一个Buffer对象



<blockquote>
  

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

  
  

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

  
  

    var body = &#8221;
  

  
  

    req.setEncoding(&#8216;utf-8&#8217;);
  

  
  

    req.on(&#8216;data&#8217;,function(chumk){
  

  
  

    body += chunk;
  

  
  

    })
  

  
  

    req.on(&#8216;end&#8217;,function(){
  

  
  

    })
  

</blockquote>
  <span class="">Fill System 是Node中使用最为频繁的模块之一,该模块提供了读写文件的能力,是借助于底层的linuv的C++ API实现的。</span>



<blockquote contenteditable="true">
  

    常用API
  

  
  

    readFile writeFile stat
  

  
  

    <span class="">fs.stat获取文件的状态(可以用来判断文件还是文件夹)</span>
  

</blockquote>
  HTTP服务 是Node的核心模块。



<blockquote contenteditable="true">
  

    var http = require(&#8220;http&#8221;)
  

  
  

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

  
  

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

  
  

    //req.method 请求方法
  

  
  

    req.on(&#8220;data&#8221;,function(chunk){
  

  
  

    }).on(&#8220;end&#8221;,function(){
  

  
  

    });
  

  
  

    res.writeHead(200,{&#8216;Content-Type&#8217;:&#8217;text/plain&#8217;,&#8221;Content-Length&#8221;:Buffer.byteLength(body)});
  

  
  

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

  
  

    });
  

  
  

    server.on(&#8220;connection&#8221;,function(req,res){
  

  
  

    });
  

  
  

    server.on(&#8220;request&#8221;,function(req,res){
  

  
  

    })
  

  
  

    server.listen(3000)
  

  
  

    //处理异常
  

  
  

    process.on(&#8220;uncaughtException&#8221;,function(){
  

  
  

    })
  

  
  

    // req.headesr 表示head信息
  

  
  

    POST上传文件
  

  
  

    表单类型设置为: enctype=&#8221;multipart/form-data&#8221;
  

  
  

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

  
  

    function dealUpload(req,res){
  

  
  

    var form = new formidable.IncomingForm();
  

  
  

    <span class="">form.eekpExtension = true;</span>
  

  
  

    form.uploadDir =__dirname;
  

  
  

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

  
  

    if(err)throw err;
  

  
  

    console.log(fields);
  

  
  

    console.log(files);
  

  
  

    res.writeHead(200,{&#8220;Content-type&#8221;:&#8217;text/plain&#8217;});
  

  
  

    <span class="">res.end(&#8216;upload finished&#8217;);</span>
  

  
  

    <span class="">})</span>
  

  
  

    }
  

  
  

    HTTP 客户端服务
  

  
  

    var http=require(&#8220;http&#8221;);
  

  
  

    http.get(&#8220;<span class="md-link" spellcheck="false">[http://www.baidu.com](http://www.baidu.com)</span>&#8220;,function(res){
  

  
  

    var statusCode = res.statusCode;
  

  
  

    if(statusCode==200){
  

  
  

    res.on(&#8220;data&#8221;,function(chunk){
  

  
  

    });
  

  
  

    res.on(&#8220;end&#8221;,function(){
  

  
  

    });
  

  
  

    res.on(&#8220;error&#8221;,function(e){
  

  
  

    <span class="">})</span>
  

  
  

    <span class="">}</span>
  

  
  

    });
  

  
  

    //代理服务器
  

  
  

    var http =require(&#8220;http&#8221;);
  

  
  

    var url = require(&#8220;url&#8221;);
  

  
  

    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(&#8220;data&#8221;,function(data){
  

  
  

    <span class="">res.write(data);</span>
  

  
  

    });
  

  
  

    pres.on(&#8220;end&#8221;,function(){
  

  
  

    <span class="">res.end();</span>
  

  
  

    <span class="">})</span>
  

  
  

    });
  

  
  

    req.on(&#8220;data&#8221;,function(data){
  

  
  

    <span class="">proxyRequest.write(data);</span>
  

  
  

    });
  

  
  

    req.on(&#8220;end&#8221;,function(){
  

  
  

    <span class="">proxyReques.end();</span>
  

  
  

    <span class="">});</span>
  

  
  

    <span class="">}).listen(8080);</span>
  

</blockquote>
  <span class="">WebSocekt (比较出名的WebSocket模块还有Socket.IO)</span>



<blockquote contenteditable="true">
  

    Node 实现WebSocket
  

  
  

    var WebSocketServer = require(&#8220;ws&#8221;).Server;
  

  
  

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

  
  

    wss.on(&#8220;connection&#8221;,function(ws){
  

  
  

    ws.on(&#8220;message&#8221;,function(message){
  

  
  

    <span class="">console.log(message);</span>
  

  
  

    });
  

  
  

    <span class="">ws.send(&#8220;Node Hello WebSocket&#8221;);</span>
  

  
  

    <span class="">})</span>
  

</blockquote>
  Events 在Node中只定义了一个类EventEmitter



<blockquote contenteditable="true">
  

    var eventEmitter = require(&#8220;events&#8221;);
  

  
  

    var myEmitter = new eventEmitter();
  

  
  

    <span class="">myEmitter.on(&#8220;begin&#8221;,function(){//注册一个begin事件</span>
  

  
  

    <span class="">console.log(&#8220;begin&#8221;);</span>
  

  
  

    <span class="">});</span>
  

  
  

    <span class="">myEmitter.emit(&#8220;begin&#8221;);//触发begin事件</span>
  

</blockquote>
  多进程服务



<blockquote contenteditable="true">
  

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

  
  

    <span class="">Cluster是Node 0.6之后新增模块(Cluster可以看做是做了封装的child_process模块)</span>
  

</blockquote>
  <span class="">Proces对象是一个全局的对象,每个Node进程都有独立的process对象,该对象中存储了当前的环境变量,也定义了一些事件</span>



<blockquote contenteditable="true">
  

    process.getuid();//用户id
  

  
  

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

  
  

    process.pid;//进程id
  

  
  

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

  
  

    process.versoin;//Node版本
  

  
  

    <span class="">process.env;//</span>
  

</blockquote>
  Timer setTimeout setInterval
  nvm



<blockquote contenteditable="true">
  

    nvm install version 安装某个版本的node
  

  
  

    nvm use veresion 切换到某个版本
  

  
  

    nvm ls 列出当前安装的所有的Node版本
  

  
  

    let关键字 会创建一个块级作用域
  

  
  

    const变量不可以再被修改
  

</blockquote>
  函数



<blockquote contenteditable="true">
  

    参数可以设置默认值
  

  
  

    function gred(x=&#8221;a&#8221;,y=&#8221;b&#8221;){
  

  
  

    }
  

  
  

    Spread运算符(&#8230;)展开运算符
  

  
  

    var ab=[&#8220;ab&#8221;,&#8221;cd&#8221;]
  

  
  

    gred(..ab);
  

  
  

    箭头函数(ES6)
  

  
  

    var func= a=>a;等价于
  

  
  

    var func = function(a){
  

  
  

    <span class="">return a;</span>
  

  
  

    }
  

  
  

    多个参数
  

  
  

    var func=(a,b)=>{
  

  
  

    <span class="">console.log(a,b);</span>
  

  
  

    <span class="">}</span>
  

</blockquote>
  Promise 异步处理



<blockquote contenteditable="true">
  

    var promis = new Promise(function(resolve.reject){
  

  
  

    //执行相关异步操作
  

  
  

    //resolve(data)
  

  
  

    // reject(err)
  

  
  

    }),then(res=>{}).catch(err=>{});
  

  
  

    <span class="">promise.all 多个promise需要执行封装为一个</span>
  

</blockquote>
  回调的终点&#8211;async/await



<blockquote contenteditable="true">
  

    node 7.6.0之后原生支持
  

  
  

    var asyncReadFile = async function(){
  

  
  

    var result1 = await readFile(&#8216;a.txt&#8217;);
  

  
  

    var result 2 = await readFile(&#8216;b.txt&#8217;);
  

  
  

    console.log(result1);
  

  
  

    <span class="">console.log(result2);</span>
  

  
  

    <span class="">}</span>
  

</blockquote>
  Koa2 构建web站点



<blockquote contenteditable="true">
  

    koa-static 静态文件服务
  

  
  

    koa-router 路由服务
  

  
  

    koa-bodyparse
  

</blockquote>
  MongoDB (Mongoose)



<blockquote contenteditable="true">
  

    npm install mongoose
  

  
  

    var mongoose = require(&#8220;mongoose&#8221;)
  

  
  

    mongoose.connect(&#8220;mongodb://xxx/test&#8221;);
  

  
  

    var db = mongose.connection;
  

  
  

    db.on(&#8220;error&#8221;,console.error.bind(console.&#8217;conection error:&#8217;))
  

  
  

    db.on(&#8216;open&#8217;.function(callback){
  

  
  

    })
  

  
  

    var loginSchema = new mongoose.Schema({
  

  
  

    username:String,
  

  
  

    <span class="">password:String</span>
  

  
  

    })
  

  
  

    <span class="">var login = db.model(&#8220;login&#8221;,loginSchema,&#8221;login&#8221;)//第一个名称是创建实例使用的名称,第二个是表结构参数,第三个是数据库显示的结合的名称不填的话默认是实例名称的复数s</span>
  

  
  

    var user1 = new login({username:&#8221;zhang&#8221;,password:&#8217;test&#8217;})
  

  
  

    user1.save(function(err){
  

  
  

    <span class="">if(err) return handleError(err)</span>
  

  
  

    <span class="">})</span>
  

</blockquote>
  Redis



<blockquote>
  

    npm install redis
  

  
  

    var redis = require(&#8220;redis&#8221;)
  

  
  

    var client = redis.createClient(&#8216;6379&#8242;,&#8217;127.0.0.1&#8217;)
  

  
  

    client.on(&#8220;error&#8221;,function(error){
  

  
  

    })
  

  
  

    client.on(&#8220;ready&#8221;,funciont(){
  

  
  

    })
  

  
  

    <span class="">client.set(&#8220;name&#8221;,&#8221;zhang&#8221;,redis.print)</span>
  

  
  

    client.get(&#8220;name&#8221;,function(err,reply){
  

  
  

    })
  

  
  

    client.publish(&#8216;test&#8217;,&#8221;hello,Node&#8221;)
  

  
  

    client.subscribe(&#8216;test&#8217;)
  

  
  

    client.on(&#8220;message&#8221;,function(channel,message){
  

  
  

    <span class="">})</span>
  

</blockquote>
  Localtunnel



<blockquote contenteditable="true">
  

    localtunnel是一个有名的第三方模块
  

  
  

    localtunnel.me
  

</blockquote>
  爬虫



<blockquote contenteditable="true">
  

    robot.txt是爬虫默认规则
  

  
  

    PHelper
  

  
  

    cheerio
  

  
  

    request.js //node第三方的HTTP请求 <span class="md-link" spellcheck="false">[https://github.com/request/request](https://github.com/request/request)</span>
  

  
  

    cheerio 网页解析 <span class="md-link" spellcheck="false">[https://github.com/cheeriojs/cheerio](https://github.com/cheeriojs/cheerio)</span>
  

  
  

    <span class="">selenium</span>
  

  
  

    MongoDB存储数据
  

  
  

    Redis消息队列
  

</blockquote>
  测试与调试



<blockquote contenteditable="true">
  

    使用Assert模块
  

  
  

    Jasmine
  

  
  

    Ava.js
  

  
  

    nyc代码覆盖率
  

  
  

    Travis
  

  
  

    <span class="">node-inspector v8-inspector</span>
  

</blockquote>
  package.json



<blockquote contenteditable="true">
  

    package.json常用字段
  

  
  

    name项目名称
  

  
  

    verion项目版本号
  

  
  

    scripts项目不同阶段的命令
  

  
  

    version字段说明
  

  
  

    version:完全匹配
  

  
  

    <span spellcheck="false">`&gt;`</span>version 大于这个版本
  

  
  

    <span spellcheck="false">`&gt;=`</span>version 大于登录这个版本
  

  
  

    ~version 非常接近这个版本
  

  
  

    ^version与这个版本不兼容
  

  
  

    1.2.x 这个符号1.2.x的版本 x是任意数字
  

  
  

    *或者“” 任何版本都可以
  

  
  

    <span class="md-expand">version1-version2 版本在version1和version2之间(包括version1和version2)</span>
  

</blockquote>