NodeJs
什么是Node.js
能让js运行在服务器端的js运行环境
为什么要把js运行在服务器端?
传统的js不能读取本地计算机硬盘上的数据(因为如果可以读取到数据,就很不安全)
在nodejs中,因为nodejs扩展了js的运行场景,把js的触手触及到了服务器端,那么就可以使用node让js访问本地硬盘上的内容
node的特性(今后看到就要想到)
- 单线程
单线程的NodeJs不会为每个连接可会创建一个线程,仅用一个线程 - 非阻塞式IO(输入/输出)
单非阻塞式IO NodeJs在访问高IO操作后不会等待其完成,而是立即去执行其他的代码,操作完成后使用回调函数返回,保证高效的利用当前线程,不会造成硬件浪费 - 事件驱动 通过事件来驱动整个程序的进行
由于是单线程,所以把高IO的操作就会移动到事件队列中等待完成,完成后通过回调函数的方式返回给线程来进行处理。
这个循环处理的过程称为事件环
说的简单一点,就是让nodejs的执行效率非常高,提升速度
node的特点
- node是单线程的
- node擅长高并发处理
- node擅长IO密集型处理
node比较适合那些应用
- 考试系统
- 图文直播
- 功夫熊(按摩的) 豆瓣的站内信 腾讯和阿里也在局部使用了node
- node单线程 如果线程崩溃,就凉凉了(不适用与大型、关键的项目)
扩展小知识
- 在node中,因为非阻塞IO的特性,所以node经常会出现回调地狱
魔术变量
__(双底杠)dirname表示当前执行脚本所在的目录
__(双底杠)filename表示当前正在执行的脚本文件名,它将输出文件所在位置的角度路劲
如何运行node
- 打开dos 或者打开shell 窗口
- 把路径指向当前要运行的文件夹
- (1)cd空格把文件夹拉过来
- (2)在指定的文件夹中按住shift 鼠标右键选择在此打开xx窗口
- 输入node空格文件名(可以不用加js后缀)
模块
每个js文件可以抽象成一个模块(作用用来封装独立的小功能点)
模块化
当前项目使用多个模块组成就是模块化
在nodejs 模块有两种
1.内置模块
2.自定义模块
1. 内置模块http
http模块可以创建node的webserver
创建的过程(先不用知道创建好之后到底能干什么 只需要能把它写出来 至于其他内容后面在说)
以下内容要做到盲写
// 1.引用创建服务器必要的http模块
var http=require("http");
// 2.使用createServer来创建服务器
// createServer(function (req,res){})
http.createServer(function(req,res){
// 3.向前台响应头信息,200是状态码,说明响应成功,返回的文件为html,字符集为utf-8
res.writeHead(200,{"content-type":"text/html;charset=utf-8"});
// 4.向前台返回一个信息,展示在页面中
res.end("hello world")
}).listen(3000);//绑定端口
2.url模块
url模块是用来操作当前的url内容
因为原生node webserver有一个小的bug 就是二次请求
解决二次请求,首先我们要知道为什么有二次请求?
就是因为当前页面需要请求title前面的小图标,造成二次请求
解决方案 判断当前这次请求是干什么的 如果是请求小图标 那么就直接return即可
详细代码
var http=require("http");
// 1.引用url模块
var url=require("url");
http.createServer(function(req,res){
res.writeHead(200,{"content-type":"text/html;charset=utf-8"});
// 为了测试二次请求那么在服务器中向控制台打印下东西
// console.log("么么哒");
// 为了解决二次请求 先来看一下为什么出现二次请求 req.url就是当前请求的路径 true 就是把当前传入的url创焕成对象
// console.log(url.parse(req.url,true));
// 解决二次请求
var reqUrl=url.parse(req.url,true);
if(reqUrl.pathname=="/favicon.ico"){
return;
}
console.log("么么哒")
res.end("你好世界!!!!")
}).listen(3000);//绑定端口
3.fs模块 写入
fs.writeFile(filename, data, [options], callback)
- filename 文件名
- data 要往文件里写的内容,可以是字符串
- options可选参数 encoding 编码,默认是utf8。flag写文件的模式
- callback 回调方法
flag写入文件模式flag{“a”}
Node往已经存在的文件里追加内容a,向内容最后插入内容