目录
开始
Node.js是服务端的javascrip
Node.js特点
事件驱动:执行一个事件回调函数中途可以转而执行其他事件,然后返回原事件;
非阻塞I/O:访问数据库代码后可立即执行后面代码,把结果放在回调函数中;
单线程:减少内存开销,但错误出现整个应用会推出。
Node.js适用场景
- 大量并发简单应用程序I/O
- 与Web socket配合开发长连接实时交互应用程序 如:考试系统 博客 聊天室
Node.js简单使用
NPM
npm是捆在Node.js安装的包管理工具
Node.js REPL
Node.js REPL 是shell或终端
- 启动REPL
node.js;
-
下划线变量
_下划线变量表示个表达式的运算结果 -
退出
Ctrl+C:退出此REPL行
Ctrl+D = 连续两次Ctrl+C退出到普通命令行 -
运行js文件
node xxx.js
Node.js 全局变量
- __filename变量
console.log(__filename) //返回路径
- __dirname变量
console.log(__dirname) //返回目录路径
- setTimeout(函数,毫秒) clearsetTimeout(计时器)
setTimeout(hanshu,3000) //三秒后执行hanshu事件一次
t = setTimeout(hanshu,3000);
clearTimeout(t); //清除计时器
- setInterval(函数,毫秒) 反复不停执行函数 clearInterval(计时器)
创建第一个应用
var pp = require("http"); //加载http模块
pp
.createServer(function(request,response){
response.writeHead(200,{"Content-Type":"text/plain"}); //发送头部 状态值200 内容
response.end("Hello world\n"); //发送响应数据 ”Hello World"
})
.listen(8080)
node 文件名.js //启动web服务
Node.js包和模块
package.json文件
包用来管理多个模块及其依赖关系,根目录必须有描述包的package.json文件,里面写名字版本号说明,搜索用的关键字等
package.json可以手写或者
npm init //生成package.json文件
npm init --yes //跳过问题生成默认的package.json文件
有package.json文件我们就能通过命令安装依赖
npm install //安装所有依赖
包操作
安装包
npm install xxx包名
更新包
npm update xxx包名
删除包
npm uninstall xxx包名
包的名字全球唯一!
模块的使用
创建
function hanshu(){
.....;
} //创建函数
module.exports.hanshu = hanshu; //提供导出
访问
var x = require("./js模块名"); //引入
x.hanshu();
Node.js函数
function hanshu(someFunction,value){
someFunction(value);
} // 函数可以作为变量在另一个函数中传递
hanshu(someFunction,value1) //使用实例
匿名函数
function(){
}
箭头函数(ES6新增)
可代替匿名函数,不可用在构造函数
(参数1,参数2...) =>{return表达式}
(参数1,参数2...)=>表达式单一
(单一参数)=>{return..}
单一参数=>{return..}
()=>{return..}
Node.js异步编程
非阻塞代码就是
程序开始加载文件后 然后直接去执行下面的代码了
Node.js事件
EvenEmitter
在模块events的方法
events.EventEmitter( )
添加监听器
emitter.on === emitter.addListener 完全一样
emitter.on("事件“,function(){
console.log("已连接");
}); //为事件添加计时器
把监听器置顶(这里用箭头函数代替了上面的匿名函数)
emitter.prependListener("事件",()=>console.log("随便是啥"));
当然也可以把回调函数赋值给变量
emitter.prependListener("事件",变量)
一次性监听器
emitter.once("事件”,.....) //只能触发一次就注销
emitter.prependOneceListener() //置顶
移除监听器
emitter.off === emtter.removeListener
emitter.off("事件",...) //一次只能移除一个
emitter.removeAllListeners() //All
emitter.removeAllListeners([事件name])
//指定名字的事件全部监听器
一旦事件触发,所有绑定的 监听器执行完才会执行移除事件
监听器数量控制
监听器最大绑定数
防止内存泄露,超过10个监听器就会警告
emitter.setMaxListeners(n) //允许监听器个数
emitter.setMaxListeners(0或infinity) //不限制个数
查看绑定监视器个数
emitter.listenerCount(eventname) //查看绑定监视器数
error事件
必须为error设置监听器,否则抛出相关信息会退出
var events = require("events"); //导入模块
var emitter = new events.EventEmitter(); //emitter对象
emitter.on("error",(err)=>{
console.error("错误信息"); //设置监听器
});
emitter.emit("error"); // $错误信息
http模块和fs模块
http模块
var http = require("http"); // 加载http模块
http
.createServer(function(request,response){
response.writeHead(200,{"Content-Type":"text/plain"});
//发送http头 状态值200 内容类型:text/plain
response.end("Hello World\n");
}) //发送响应数据
.listen(8080);
- request请求对象 每次有请求都会触发
request.url获 取请求路径,端口号之后的/开头的那一部分request.socket.localAddress获取ip地址request.socket.remotePort获取源端口
- response响应对象 常用方法
1.向请求发送响应头
response.writeHead(
statusCode[,statusMessage][,headers])//只能调用一次
必须在end前调用
statusCode:状态码 200表示正常,404表示没找到 statusMessage:可选的 显示给用户的信息
headers:响应头 设置Content-Type 网页编码和文件类型 如: text/html:HTML格式
text/plain:纯文本格式
2.向用户发送响应数据 (文本或html代码)
response.write() //可使用多次
最后用response.end()结束 不如客户端会一直等待
3.表示结束
response.end() //每个响应都要结束
fs模块
导入require("fs")
异步打开文件fs.open(path,flags[,mode],callback);
- mode:设置文件权限 默认0o666可读写
- callback回调函数 callback(err,fd)
| flags参数 | 功能 |
|---|---|
| ”a“ | 创建文件或追加内容 |
| “r+” | 读取和追加 |
| ”w+“ | 创建或截断 追加 |
异步关闭文件fs.close(fd,callback);
- fd:
fs.open()返回的文件描述符
异步读取文件fs.read(fd,buffer,offset,length,position,callback); - fd:通过fs.open()返回的文件描述符 buffer:数据写入的缓冲区
- offset:缓冲区开始写入的偏移量 一般为0
- length:指定读取的字节书 整数
- position:文件开始读取的位置, position为null则从当前位置读取,并更新文件位置
- callback:回调函数
(err,bytesRead,buffer)
异步写入文件 fs.write(fd,buffer,offset,length,position,callback)
-
offset:指定要写入的buffer部分
-
position:写入开头偏移量
typeof position !== 'number'时从当前位置写入数据
异步获取文件信息 fs.stat(path,callback)
异步截取文件 fs.ftruncate(fd[,len],callback);
- len:文件内容截取长度,默认为0
异步删除文件 fs.unlink(path,callback);
修改文件名 fs.rename(oldPath,newPath,callback);
异步创建目录 fs.mkdir(path[,options],callback);
options:
recursive是否以递归方式创建目录 默认false
mode设置目录权限 默认0o777
异步读取目录 fs.readdir(path[,options],callback);
options:encoding 默认 ‘utf8’
withFileTypes 默认false
异步删除目录 fs.rmdr(path,callback);
Express框架
Express是Node.js的 Web框架,用来搭建一个完整功能的网站。
安装
npm install express
路由
确定应用程序如何响应客户端请求
app.method(path,handler)
- app:是Express的实例
- method:HTTP请求方法(GET,POS等)
- path:服务器上的路径
- handler:路由匹配时执行的函数
静态文件
var app = express();
app.use(express.static("public"))
- public:图片 CSS Javascript 等静态文件所在目录
GET请求和POST请求
...........
本文介绍了Node.js的特点,如事件驱动、非阻塞I/O和单线程,适合于大量并发简单应用程序I/O和实时交互应用程序。讲解了Node.js的简单使用,包括NPM、REPL、全局变量以及创建第一个应用。详细阐述了模块、函数、异步编程、事件和 EventEmitter。还探讨了http模块和fs模块,以及如何使用Express框架搭建Web应用,包括路由、静态文件处理和HTTP请求响应。
1570

被折叠的 条评论
为什么被折叠?



