基础汇总 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 = ” req.setEncoding(‘utf-8’); req.on(‘data’,function(chumk){ body += chunk; }) req.on(‘end’,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(“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(); <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,{“Content-type”:’text/plain’}); <span class="">res.end(‘upload finished’);</span> <span class="">})</span> } HTTP 客户端服务 var http=require(“http”); http.get(“<span class="md-link" spellcheck="false">[http://www.baidu.com](http://www.baidu.com)</span>“,function(res){ var statusCode = res.statusCode; if(statusCode==200){ res.on(“data”,function(chunk){ }); res.on(“end”,function(){ }); res.on(“error”,function(e){ <span class="">})</span> <span class="">}</span> }); //代理服务器 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){ <span class="">res.write(data);</span> }); pres.on(“end”,function(){ <span class="">res.end();</span> <span class="">})</span> }); req.on(“data”,function(data){ <span class="">proxyRequest.write(data);</span> }); req.on(“end”,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(“ws”).Server; var wss = new WebScoketServer({port:3304}); wss.on(“connection”,function(ws){ ws.on(“message”,function(message){ <span class="">console.log(message);</span> }); <span class="">ws.send(“Node Hello WebSocket”);</span> <span class="">})</span> </blockquote> Events 在Node中只定义了一个类EventEmitter <blockquote contenteditable="true"> var eventEmitter = require(“events”); var myEmitter = new eventEmitter(); <span class="">myEmitter.on(“begin”,function(){//注册一个begin事件</span> <span class="">console.log(“begin”);</span> <span class="">});</span> <span class="">myEmitter.emit(“begin”);//触发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=”a”,y=”b”){ } Spread运算符(…)展开运算符 var ab=[“ab”,”cd”] 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> 回调的终点–async/await <blockquote contenteditable="true"> node 7.6.0之后原生支持 var asyncReadFile = async function(){ var result1 = await readFile(‘a.txt’); var result 2 = await readFile(‘b.txt’); 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(“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, <span class="">password:String</span> }) <span class="">var login = db.model(“login”,loginSchema,”login”)//第一个名称是创建实例使用的名称,第二个是表结构参数,第三个是数据库显示的结合的名称不填的话默认是实例名称的复数s</span> var user1 = new login({username:”zhang”,password:’test’}) user1.save(function(err){ <span class="">if(err) return handleError(err)</span> <span class="">})</span> </blockquote> Redis <blockquote> 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(){ }) <span class="">client.set(“name”,”zhang”,redis.print)</span> client.get(“name”,function(err,reply){ }) client.publish(‘test’,”hello,Node”) client.subscribe(‘test’) client.on(“message”,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">`>`</span>version 大于这个版本 <span spellcheck="false">`>=`</span>version 大于登录这个版本 ~version 非常接近这个版本 ^version与这个版本不兼容 1.2.x 这个符号1.2.x的版本 x是任意数字 *或者“” 任何版本都可以 <span class="md-expand">version1-version2 版本在version1和version2之间(包括version1和version2)</span> </blockquote>