基础汇总#
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>
💬 评论