常用的属性和方法
命令行输入node
进入交互模式,可以在终端执行语句;
node file.js
执行JS文件;
node是单线程,回调执行异步,提高了性能
回调在最后参数位置;
回调函数中第一参数是错误,第二个是成功;
检测window系统中path设置,cmd输入path
npm i
本地安装
npm i
全局安装
npm list
查看安装的包的版本信息
使用淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
终端输入node
进入交互模式,支持多行输入,自动识别多行语句;
下划线_
变量:获取上一个表达式的结果;
REPL 命令:
所有产生事件的对象,都是events.EventEmitter的实例
events模块唯一一个对象:events.EventEmitter
=> 事件触发与事件监听器功能的封装
events.EventEmitter的方法:
on(event,listener)
为指定事件注册监听器,传入回调函数once(event,listener)
一次监听器addListener(event,listener)
为指定事件额外添加监听器,传入回调函数removeListener(event,listener)
移除指定监听器的指定的回调函数removeAllListener([event])
移除所有监听器,或指定事件所有监听器setMaxListener(n)
默认10个监听器listener(event)
返回指定事件的监听器数组emit(event,[arg1],[arg2],[...])
执行事件的监听器数组,有注册返回true,没false类方法:
events.EventEmitter.listenerCount(eventName)
事件监听器数量, 已废除events.emitter.listenerCount(eventName)
事件监听器数量事件:
继承:
大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它
JS只有字符串数据类型,没有二进制数据类型
处理TCP流或者文件流,须要二进制数据,所以buffer二进制缓冲区
在v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,
但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,
所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象。
Node.js 目前支持的字符编码包括:
创建Buffer类
var buf = null
Buffer.alloc(size[, fill[, encoding]])
: 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0Buffer.allocUnsafe(size)
: 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据Buffer.from(array)
: 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)Buffer.from(arrayBuffer[, byteOffset[, length]])
: 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。Buffer.from(buffer)
: 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例Buffer.from(string[, encoding])
: 返回一个被 string 的值初始化的新的 Buffer 实例写入缓冲区
buf.write(string[, offset[, length]][, encoding])
(字符串,开始的索引默认0,长度默认最大,编码默认urf8);大小超过的部分不会被接入;返回实际写入的大小(长度)buf.writeUIntLE(value, offset, byteLength[, noAssert])
buf.writeUIntBE(value, offset, byteLength[, noAssert])
buf.writeIntLE(value, offset, byteLength[, noAssert])
buf.writeIntBE(value, offset, byteLength[, noAssert])
buf.writeUInt8(value, offset[, noAssert])
buf.writeUInt16LE(value, offset[, noAssert])
buf.writeUInt16BE(value, offset[, noAssert])
buf.writeUInt32LE(value, offset[, noAssert])
buf.writeUInt32BE(value, offset[, noAssert])
buf.writeInt8(value, offset[, noAssert])
buf.writeInt16LE(value, offset[, noAssert])
buf.writeInt16BE(value, offset[, noAssert])
buf.writeInt32LE(value, offset[, noAssert])
buf.writeInt32BE(value, offset[, noAssert])
buf.writeFloatLE(value, offset[, noAssert])
buf.writeFloatBE(value, offset[, noAssert])
buf.writeDoubleLE(value, offset[, noAssert])
buf.writeDoubleBE(value, offset[, noAssert])
读取
buf.toString([encoding[, start[, end]]])
默认开始-末尾;返回编码后的字符串buf.readUIntLE(offset, byteLength[, noAssert])
buf.readUIntBE(offset, byteLength[, noAssert])
buf.readIntLE(offset, byteLength[, noAssert])
buf.readIntBE(offset, byteLength[, noAssert])
buf.readUInt8(offset[, noAssert])
buf.readUInt16LE(offset[, noAssert])
buf.readUInt16BE(offset[, noAssert])
buf.readUInt32LE(offset[, noAssert])
buf.readUInt32BE(offset[, noAssert])
buf.readInt8(offset[, noAssert])
buf.readInt16LE(offset[, noAssert])
buf.readInt16BE(offset[, noAssert])
buf.readInt32LE(offset[, noAssert])
buf.readInt32BE(offset[, noAssert])
buf.readFloatLE(offset[, noAssert])
buf.readFloatBE(offset[, noAssert])
buf.readDoubleLE(offset[, noAssert])
buf.readDoubleBE(offset[, noAssert])
buf[index]
获取或设置指定字节转为JSON
buf.toJSON()
当字符串化一个 Buffer 实例时,JSON.stringify(buf) 会隐式地调用该 toJSON()。缓冲区合并
Buffer.concat(list[, totalLength])
(buf数组,指定总长度)比较
buf.compare(otherBuffer)
和另一个buf对象比较,返回0为相同,<0为之前,>0为之后buf.equals(otherBuffer)
是否相等拷贝插入
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
将target插入覆盖替换掉指定位置,(插入的buf,插入点,插入后保留开始点,结尾点)裁剪
buf.slice([start[, end]])
返回浅拷贝的指定裁剪段缓冲区长度
buf.length
填充
buf.fill(value[, offset][, end])
可重复填充,覆盖替换指定位置四种流类型: Readable(可读操作)、 Writable(可写操作)、 Duplex(可读可写操作)、 Transform(操作被写入数据,然后读出结果)。
所有的 Stream 对象都是 EventEmitter 的实例;
常用的事件有:data(当有数据可读时触发)、end(没有更多的数据可读时触发)、error(在接收和写入过程中发生错误时触发)、finish(所有数据已被写入到底层系统时触发)。
var fs = require("fs");
var data = "";
//创建流
var readerStream = fs.createReadStream("" );
//设置编码
readerStream.setEncoding("UTF8");
//处理事件流 ==> data,end,error
readerStream.on("data",function(chunk){
data += chunk;
})
readerStream.on("end",function(){
console.log(data)
})
readerStream.on("error",function(err){
console.log(err.stack)
})
console.log("程序执行完成")
var fs = require("fs");
var data = "写入的内容";
//创建流
var writerStream = fs.createWritetream("" );
//写入,编码
writerStream.write(data,"UTF8");
//标记文件末尾
writerStream.end();
//处理事件流 ==> finish,error
writerStream.on("finish",function(chunk){
console.log("写入完成")
})
writerStream.on("error",function(err){
console.log(err.stack)
})
console.log("程序执行完成")
var fs = require("fs");
var readerStream = fs.createReadStream("input.txt");
var writerStream = fs.createWriteStream("output.txt");
readerStream.pipe(writerStream)
示例:压缩和加压文件
var fs = require("fs")
var zlib = require("zlib")
//读取,压缩,写入
fs.createReadStream("input.txt")
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream("input.txt.gz"));
//读取,解压,写入
fs.createReadStream("input.txt.gz")
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream("input.txt"))
一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
exports公开模块,require引入模块
//hello.js
exports.yo = function(){
console.log("hello world ~ !");
}
//main.js
var hello = require("./hello.js");
hello.yo();
module.exports = name 代替 exports.name ,输出的是对象,而不是exports;
如果要对外暴露属性或方法,就用exports就行,要暴露对象(类似class,包含了很多属性和方法),就用module.exports。
//hello.js
function yo(){
var name;
this.setName = function(thyName){
name = thyName;
},
this.sayHello = function(){
console.log("hello" + name)
}
}
module.exports = yo;
//main.js
var Hello = require("./hello.js")
hello = new Hello();
hello.setName("yoho");
hello.sayName();//yoho
模块优先级:
文件模块缓存 > 原生模块 > 文件加载
require方法接受以下几种参数的传递:
传参可以是函数本身,函数使用另一个函数,甚至是匿名函数;
获取url路径,对不同路由做出不同处理函数,封装模块
//server.js
var http = require("http")
var url = require("url")
function start(route){
function onRequest(req,res){
var pathname = url.parse(req.url).pathname;
console.log("pathname:" + pathname)
route(pathname)
res.writeHead(200,{"Content-Type":"text/plain"})
res.write("Hello World")
res.end()
}
http.createRequest(onRequest).listen(8888)
console.log("Server has started.")
}
exports.start = start;
//router.js
function route(pathname){
console.log("this is a route : " + pathname)
}
exports.route = route
//index.js
var server = require("./server")
var router = require("./router")
server.start(router.route)
浏览器JavaScript中是window
,node的JavaScript中是global
;所有的全局变量都是global的属性;
不用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险
__filename
当前执行的脚本文件名__dirname
当前执行的脚本所在目录setTimeout(cb,ms)
在指定毫秒(ms)后执行函数(cb),只执行一次clearTimeout(t)
停止指定计时器(t)setInterval(cb,ms)
在指定毫秒(ms)循环执行函数(cb)clearInterval(t)
清除定时器(t)console
向标准输出流或标准错误流输出字符
console.log([data][,...])
只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则 以类似于C 语言 printf() 命令的格式输出。
console.info([data][, ...])
、console.error([data][, ...])
、console.warn([data][, ...])
;
console.dir(obj[, options])
对一个对象进行检查inspect;
console.time(label)
、console.timeEnd(label)
计时开始时间/结束时间;
console.trace(message[, ...])
当前代码在堆栈中的调用地址;
console.assert(value[, message][, ...])
判断是否为真,false输出message;
process
进程状态– 事件:
exit
进程退出时触发;
beforeExit
node清空事件循环,且没其他安排;异步调用;
uncaughtException
异常冒泡回到事件循环触发;如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。
signal
进程接收到信号触发
process.on("exit" ,function(){
...
})
– 退出状态码
– 属性
stdout
标准输出流
stderr
标准错误流
stdin
标准输入流
argv
执行脚本时的各种参数
execPath
当前脚本的二进制文件绝对路径
execArgv
执行脚本的命令行参数
env
当前shell的环境变量
exitCode
进程退出时的代码,如果进程优通过process.exit()退出,不需要指定退出码。
version
node版本
versions
node版本和依赖
config
编译node的执行配置
pid
进程号
title
进程名,默认node
arch
当前CPU架构
platform
当前平台系统
mainModule
require.main 的备选方法
– 方法
abort()
中断
chdir(directory)
改变当前进程的目录
cwd()
返回当前的工作目录
exit([code])
结束进程
kill(pid[,signal])
发送信号给进程
memoryUsage()
返回进程所用的内存状况
nextTick(callback)
当前事件结束,马上调用回调
umask([mask])
设置或读取进程的掩码
uptime()
返回node已运行秒数
hrtime()
返回当前进程的高分辨时间,通过精确的时间间隔,衡量程序的性能
//以下仅在POSIX平台上可用
getgid()
获取进程的群组标识
setgid(id)
设置进程的群组标识
getuid()
获取进程的用户标识
setuid(id)
设置进程的用户标识
getgroups()
返回进程的群组ID数组
setgroups(groups)
设置进程的群组ID
initgroups(user,extra_group)
读取/etc/group,并初始化访问列表
util.inherits(constructor,superConstructor)
对象间的继承JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的。
util.inspect(object,[showHidden],[depth],[colors])
任意对象转换为字符串,用于调试和错误输出,(obj,是否显示更多隐藏信息,递归层数,是否ANSI颜色编码)
util.isArray(object)
返回是否为数组util.isRegExp(obj)
返回是否为正则表达式util.isData(obj)
返回是否为日期util.isError(obj)
返回是否为错误对象Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API,引入fs
模块,均有异步和同步版本
打开文件
fs.open(path,flags[,mode],callback)
:
path:文件路径
flags:r
读、r+
读,可写、rs
同步读、rs+
同步读,可写、w
写,不存在就创建、w+
写,可读,不存在就创建、wx
写,已存在就报错、wx+
写,可读,已存在就报错、a
追加,不存在就创建、a+
追加,可读可写,不存在就创建、ax
追加,已存在就报错、ax+
追加,可读可写,已存在就报错
mode:设置文件模式(权限),文件创建默认权限为0666(读写)
callback(err,fd):回调函数
读取文件信息
fs.stat(path,callback)
:
callback(err,stats):stats是fs.Stats对象,判断文件的相关属性,例如stats.isFile();
stats中的方法:
stats.isFile()
是否为文件
stats.isDirectory()
是否为目录
stats.isBlockDevice()
是否为块设备
stats.isCharacterDevice()
是否为字符设备
stats.isSymbolicLink()
是否为软连接
stats.isFIFO()
是否为FIFO(UNIX中的命令管道)
stats.isSocket()
是否为Socket
读取文件
fs.read(fd,buffer,offset,length,position,callback)
:
fs:fs.open()返回的文件描述符
buffer:写入的缓冲区
offset:缓冲区写入的偏移量
length:读取的字节数
position:读取的起始位置
callback(err,bytesRead,buffer):
写入文件
fs.writeFile(file,data[,options],callback)
:默认w
模式打开,所以写入会覆盖原内容
file:文件名或文件描述符
data:写入的数据,字符串或缓冲区对象
options:{encoding,mode,flag},默认{utf8,0666,w}
callback(err):失败时返回
关闭文件
fs.close(fd,callback)
:通过fs.open
回调中的文件描述符fd关闭文件
截取文件
fs.ftruncate(fd,len,callback)
:异步模式下通过fs.open
回调中的文件描述符fd截取文件
删除文件
fs.unlink(path,callback)
:回调没有传参
创建目录
fs.mkdir(path[,options],callback)
:
path:文件路径
options:{recursive,mode},{是否递归方式创建,权限},默认{false,0777}
callback:回调没有传承
读取目录
fs.readdir(path,callback)
:
path:路径
callback(err,files):files为目录下文件数组列表
删除目录
fs.rmdir(path,callback)
var http = require("http")
var url = require("url")
var util = require("util")
http.createServer(function(req,res){
res.writHead(200,{"Content-Type":"text/plain;charset=utf-8"});
res.end(util.inspect(url.parse(req.url,true)));
}).listen(3000);
//访问https://www.xxx.com:8080?name=xxx&url=www.xxx.com
var http = require("http")
var url = require("url")
http.createServer(function(req,res){
res.writeHead(200,{"Content-Type":"text/plain"})
//解析URL参数
var params = url.parse(req.url,true).query
res.write("网络名:"+ params.name);
res.write("\n")
res.write("网站URL:" + params.url )
res.end()
}).listen(3000)
var http = require("http")
var querystring = require("querystring")
var util = require("util")
http.createServer(function(req,res){
//存储请求体的变量
var post = "";
//监听,每次请求体的数据,累加的post中
req.on("data",function(chunk){
post += chunk
})
//end触发后,解析后返回客户端
req.on("end",function(){
post = querystring.parse(post);
res.end(util.inspect(post));
})
}).listen(3000)
目前最主流的三个Web服务器是Apache、Nginx、IIS。
var http = require("http")
var fs = require("fs")
var url = require("url")
http.createServer(function(req,res){
var pathname = url.parse(req.url).pathname;
console.log("pathname: "+ pathname)
fs.readFile(pathname.substr(1),function(err,data){
if(err){
console.log(err)
res.writeHead(404,{"Content-Type":"text/html"})
}else{
res.writeHead(200,{"Content-Type":"text/html"})
res.write(data.toString())
}
res.end()
})
}).listen(8080);
console.log("Server running at http://localhost:8080/")
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
head>
<body>
<h1>Hello Worldh1>
<p>yo yo qie ke nao ,you say yes i say no ~p>
body>
html>
var http = require("http")
var options = {
host:"localhost",
port:"8080",
path:"/index.html"
}
var callback = function (res){
var body = ""
res.on("data",function(data){
body += data;
})
res.on("end",function(){
console.log(body)
})
}
var req = http.request(options,callback);
req.end();
Express框架
安装:npm i express --sava
,
重要模块:body-parser,cookie-paser,multer
npm i body-parser --save
npm i cookie-parser --save
npm i multer --save
EXPRESS–菜鸟教程
RESTful API
REST即表述性状态传递(英文:Representational State Transfer,简称REST),一组架构约束条件和原则,是设计风格而不是标准。REST 通常使用 JSON 数据格式。
基于REST架构的Web Services即是RESTful。
多进程
node.js是单线程,多个子进程,提高性能。使用child_process模块-
child_process.exec(command[, options], callback)
child_process.spawn(command[, args][, options])
child_process.fork(modulePath[, args][, options])
JXcore打包
MySQL
MongoDB
方法
os.empdir()
操作系统的临时文件夹os.endianness()
CPU字节序,“BE”或"LE"os.hostname()
操作系统的主机名os.type()
操作系统名os.platform()
编译时的操作系统名os.arch()
CPU架构,“x64”、“arm”、“ia32”os.release()
操作系统的发行版本os.uptime
操作系统运行的时间os.loadavg()
1,5,15分钟平均负载的数组os.totalmm()
系统内存总量os.freemem()
空闲内存总量os.cpus()
CPU/内核的信息的数组os.networkInterfaces()
网络接口列表属性
os.EOL
定义操作系统的行尾符的常量方法:
path.normalize(p)
规范化路径path.join([path1][,path2][,...])
连接路径,Unix系统是"/",Windows系统是""path.resolve([form...],to)
将to参数解析为绝对路径path.isAbsolute(path)
是否为绝对路径path.relative(from,to)
将to参数的绝对路径转换为相对路径,path.dirname(p)
返回路径p中,代表文件夹的部分path.basename(p[,ext])
返回路径p中的最后一部分path.extname(p)
返回路径p中的文件后缀名,没有返回空path.parse(pathString)
返回路径字符串的对象path.format(pathObj)
返回对象中路径字符串,和path.parse()相反属性
path.sep
文件路径分隔符,\\
或/
path.delimiter
分隔符,;
或:
path.posix
以 posix 兼容的方式交互path.win32
以 win32 兼容的方式交互Net模块
DNS模块
Domain看模块
fs.rename(oldPath, newPath, callback)
fs.ftruncate(fd, len, callback)
fs.ftruncateSync(fd, len)
fs.truncate(path, len, callback)
fs.truncateSync(path, len)
fs.chown(path, uid, gid, callback)
fs.chownSync(path, uid, gid)
fs.fchown(fd, uid, gid, callback)
fs.fchownSync(fd, uid, gid)
fs.lchown(path, uid, gid, callback)
fs.lchownSync(path, uid, gid)
fs.chmod(path, mode, callback)
fs.chmodSync(path, mode)
fs.fchmod(fd, mode, callback)
fs.fchmodSync(fd, mode)
fs.lchmod(path, mode, callback)
fs.lchmodSync(path, mode)
fs.stat(path, callback)
fs.Stats 对象
。fs.lstat(path, callback)
fs.Stats 对象
。fs.fstat(fd, callback)
fs.Stats 对象
。fs.statSync(path)
fs.Stats 的实例。
fs.lstatSync(path)
fs.Stats 的实例。
fs.fstatSync(fd)
fs.Stats 的实例。
fs.link(srcpath, dstpath, callback)
fs.linkSync(srcpath, dstpath)
fs.symlink(srcpath, dstpath[, type], callback)
fs.symlinkSync(srcpath, dstpath[, type])
fs.readlink(path, callback)
fs.realpath(path[, cache], callback)
fs.realpathSync(path[, cache])
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.rmdir(path, callback)
fs.rmdirSync(path)
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
fs.readdir(path, callback)
fs.readdirSync(path)
fs.close(fd, callback)
fs.closeSync(fd)
fs.open(path, flags[, mode], callback)
fs.openSync(path, flags[, mode])
fs.open()
。fs.utimes(path, atime, mtime, callback)
fs.utimesSync(path, atime, mtime)
fs.futimes(fd, atime, mtime, callback)
fs.futimesSync(fd, atime, mtime)
fs.fsync(fd, callback)
fs.fsyncSync(fd)
fs.write(fd, buffer, offset, length[, position], callback)
fs.write(fd, data[, position[, encoding]], callback)
fs.writeSync(fd, buffer, offset, length[, position])
fs.write()
。fs.writeSync(fd, data[, position[, encoding]])
fs.write()
。fs.read(fd, buffer, offset, length, position, callback)
fs.readSync(fd, buffer, offset, length, position)
fs.read
。fs.readFile(filename[, options], callback)
fs.readFileSync(filename[, options])
fs.writeFile(filename, data[, options], callback)
fs.writeFileSync(filename, data[, options])
fs.writeFile
。fs.appendFile(filename, data[, options], callback)
fs.appendFileSync(filename, data[, options])
fs.appendFile
。fs.watchFile(filename[, options], listener)
fs.unwatchFile(filename[, listener])
fs.watch(filename[, options][, listener])
fs.FSWatcher
对象。fs.exists(path, callback)
fs.existsSync(path)
fs.exists
。fs.access(path[, mode], callback)
fs.accessSync(path[, mode])
fs.access
。fs.createReadStream(path[, options])
fs.createWriteStream(path[, options])
fs.symlink(srcpath, dstpath[, type], callback)