nodejs
最近的面试中,nodejs有被问到,面试前临时现补一些比如http模块,path模块,非阻塞异步I/O,高性能等等知识点
其实工作中一直没怎么涉及nodejs作为服务端或者中间件开发,所以了解的不是很深入,现在前端细分的话,传统的web开发工程师、可视化开发工程师、nodejs工程师、配置架构工程师,要会的东西着实有点多,当然大佬们可以全部都会
之前有看一篇博客学习nodejs作为服务端开发结合mongodb数据库,博主讲的很细,我觉得挺好的,一共十一篇,包括最终的demo也有提供,地址是nodejs零基础详细教程
nodejs
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
其实node.js就是一个可以在服务器端运行 javascript的环境而已 – 运行环境
Node.js遵守CommonJS规范
阻塞和非阻塞
这里就得要涉及到同步和异步
的概念,
同步:我们js代码是从上往下执行的,上一条代码没执行完成,不执行下一条代码就是同步。
异步:在上面代码执行的时候,下面代码也可以同时执行。
那么阻塞就是同步的状态表示,而非阻塞就是异步的状态表示。
- 实现异步有两种方式
– 回调函数:监听到某个事件活动后,再执行别的代码,这种情况不影响后续代码执行,属于异步
– 定时器:setTimeout 和 setInterval
npm
全称 node package manager吧,node包管理工具
-
npm作用:
– 允许用户从NPM服务器下载别人编写的第三方包到本地使用。npm install
– 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
– 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。npm publish
常用命令
node install、npm i、npm install -g --save
npm uninstall 包名 -
之前写过一篇npm包发布流程笔记 npm包发布教程以及安装使用
path
nodejs内置path模块
path提供的方法参考这篇文章整理 Nodejs path模块
fs文件操作模块
node自带文件操作模块 fs
var fs = require("fs"); //node 内置模块可直接引入 fs:文件系统操作模块
fs.readFile("./a.txt","utf-8",function(err,data){ //读取文件
if(err) throw err;//抛出异常
//读取的后续操作可写在这里
fs.writeFile("./b.txt",data,function(err){ //写入文件
if(err) throw err;
})
});
//创建文件夹
fs.mkdir("c",function(err){ //创建 c 文件
if(err) throw err;
})
//修改文件、文件夹名称
fs.rename("c","d",function(err){ //将c 文件夹名字 改为 d
if(err) throw err;
})
http模块,创建后台服务器
node自带创建服务的模块 http,使用时只需要直接引入即可
//首先引入http模块
//然后调用createServer方法创建服务,里面只有一个参数(回调函数:表示请求发生的时候需要执行的代码【回到函数有两个参数,1、请求信息,2、相应信息】)
//最后需要添加端口监听listen(自定义端口号,这里我们常规使用3000)
var http = require("http");
http.createServer(function(request,response){
console.log("request going"); //当浏览器访问的时候,在控制台回打印此消息
response.end("haha");//表示请求结束,将结果返回给浏览器
}).listen(3000);
node.js事件机制
node.js是单线程,但是通过事件和回调支持并发,可以实现非常高的性能,node.js所有的API都是通过异步调用
- node.js的事件模型
– Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
– 当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
– 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
异步IO操作
我们前面讲的文件读取的方式是一次性全部读取,当文件过大的时候,一次性读取不仅缓慢,而且影响用户体验,那么怎么实现分步读取呢,这就得使用到异步IO的操作,像水流一样流出一段取得一段
var fs = require("fs");
var data = ""; //声明一个空字符串来存读取的数据
var rs = fs.createReadStream("a.txt");
rs.setEncoding("utf-8");
//监听当有数据流入的时候
rs.on("data",function(chunc){
data += chunc; //将读取的数据拼接到data上。
console.log("..."); //读的过程中,我们打印三个点。
});
rs.on("end",function(){
console.log("没有数据了")
});
代码中,使用 reateReadStream创建读取流对象,在对象上使用on监听“data”读取数据的事件,每读取一段数据,就会触发这个事件,当读取完毕, 就会触发“end”事件。
express mongodb
参考博客
node.js零基础详细教程(5):express 、 路由
node.js零基础详细教程(6):mongodb数据库操作 以及导入导出
node.js零基础详细教程(7):node.js操作mongodb,及操作方法的封装
node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
nodejs面试题
未完待续,持续补充…