技术标签: node.js 面试文档 Node.js javascript
谈谈对Node的理解
Node.js 在浏览器外运行V8 JavaScript引擎,单线程 非阻塞I/O 事件驱动,适应于数据高并发,适合多请求,但不适合高运算,有权限读取操作系统级别的API,无法直接渲染静态页面,提供静态服务,没有根目录的概念,必须通过路由程序指定文件才能渲染文件,比其他服务端性能更好,速度更快,npm 仓库,常用框架:Express,koa,Socket.io,AdonisJs,NestJS
什么是gulp?作用?机制是什么?常用命令有哪些?
gulp是基于node的自动化构建工具
作用:
1 自动压缩JS文件
2 自动压缩CSS文件
3 自动合并文件
4 自动编译sass
5 自动压缩图片
6 自动刷新浏览器
机制:
Unix操作系统的管道(pipe)思想 前一级输出 后一级输入
常用命令:
.src 输出(Emits)符合所提供的匹配模式(glob)或者匹配模式的数组(array of globs)的文件。 将返回一个 Vinyl files 的 stream 它可以被 piped 到别的插件中。
.watch 监视文件,并且可以在文件发生改动时候做一些事情。它总会返回一个 EventEmitter 来发射(emit) change 事件。
.dest 能被 pipe 进来,并且将会写文件。并且重新输出(emits)所有数据,因此你可以将它 pipe 到多个文件夹。如果某文件夹不存在,将会自动创建它。
.pipe 传入方法的是一个function,这个function作用无非是接受上一个流(stream)的结果,并返回一个处理后流的结果(返回值应该是一个stream对象)。
.task 定义一个使用 Orchestrator 实现的任务(task)
如何判断当前脚本运行在浏览器还是node环境中?
this === window ? 'browser' : 'node',通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中
node.js有哪些常用模块?
util是node 里面一个工具模块,node里面几乎所有的模块都会用到这个模块
功能:
1:实现继承这是主要功能
2:实现对象的完整输出
3:实现判断数据类型
path模块
功能:格式规范化路径
fs模块
功能:
1:操作文件
2:操作目录
http模块:用于搭建HTTP服务端和客户端
url模块:用户解析和处理URL字符串
url.parse(将url字符串解析并返回一个url的对象)
url.format(将url对象编程一个url字符串并返回)
url.resolve(将url中的参数用/进行拼接)
zlib模块:提供了用Gzip和Deflate/Inflate实现的压缩功能
socket.io: 实现客服端与服务端之间的实时通信方式
uglify-js: 用来压缩合并js文件
child_process:新建子进程。
querystring:解析URL中的查询字符串。
crypto:提供加密和解密功能。
Express框架的核心特性是什么
1.可以设置中间件来响应http请求
2.定义了路由表用于执行不同的HTTP请求动作
3.可以通过向模板传递参数来动态渲染html页面
对Node的思想一切皆异步的理解
node本身就是非阻塞I/O,与其他后端编程思想不同,虽然php, python, java中也有异步方法,但是编程人员的思想是同步的,node的思想目的是可以让开发者轻松编写高性能的web服务端,而不会通过同步思想api阻塞了服务器从而影响性能。而且node.js大部分api都是异步的,只有小量同步api,这与其他大部分语言刚好相反。
node如何实现异步非阻塞(I/O)
在node中,I/O(输入输出)是异步非堵塞的关键,I/O操作通常比较耗时但不会独占CPU,典型的I/O比如文件读写,远程数据库读写,网络请求等,如果用同步API来进行I/O操作,在返回结果之前就只能等待,此时阻塞代码会霸占cpu,导致本进程所有代码都等待,而node.js里面的I/O API都是不会霸占CPU的(原因:node中的核心库libuv会将建立的所有I/O操作内容绑定到单个线程上。只要每个事件循环在不同的线程中,就可以运行多个事件循环,libuv为Node.js提供了跨平台、线程池、事件池、异步I/O等能力),所以是非阻塞的。拿JS中的setTimeout来打比方,当用户使用setTimeout时,JS会开辟出一个异步线程池,与主线程分开执行,结果就是之前的代码继续执行,setTimeout的代码延时执行,等成功后再调用主线程的方法
node中的exports如何实现的,它和module.exports有什么关系
exports实现:exports = module.exports = {};就好像是var a = { } var b = a,看上去没有太大区别,但使用起来却又不同
module是一个对象,当我们在控制台输入node并执行,在node中执行module或者执行js文件打印module时会发现以下log
Module {
id: '<repl>',
path: '.',
exports: {},
parent: undefined,
filename: null,
loaded: false,
children: [],
paths: [
...
]
}
不难发现,module是Module的实例,exports是其中一个属性,也就是说当你在node中执行一个js文件或者使用require引入模块时,nodejs都会新建一个var module = new Module(),并执行exports = module.exports,这也就是为什么直接打印exports和exports时,控制台不会报错,如果在node中执行以下代码,就能清楚的看出这二者的引用关系了
console.log(module.exports) // {}
console.log(exports) // {}
module.exports.name = '张三'
exports.age = 22
console.log(module.exports) // { name: '张三', age: 22 }
console.log(exports) // { name: '张三', age: 22 }
谈谈Node.js加载模块机制
node.js中模块有两种类型:核心模块和文件模块
核心模块直接使用名称获取,文件模块只能按照路径加载(可以省略默认的.js拓展名,不是js文件的话需要显示声明书写)
模块加载规则:
对Node的优点和缺点提出了自己的看法
优点:因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求, 因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。 此外,与Node代理服务器交互的客户端代码是由javascript语言编写的, 因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
缺点:Node是一个相对新的开源项目,所以不太稳定,它总是一直在变, 而且缺少足够多的第三方库支持(第三方库现在已经很丰富了,所以这个缺点可以说不存在了)。看起来,就像是Ruby/Rails当年的样子。
Node.js的适用场景
原生Node如何解决跨域
const http = require('http');
http.createServer((req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
res.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
}).listen(8080);
反向代理是什么,如何实现
反向代理是指代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端
实现过程(这里的目标服务器是用getman产生的假数据):
前端部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$.post('http://127.0.0.1:1024', {// 访问代理服务端,获取目标服务器的数据
token: '1234'
}, function (res) {
console.log(JSON.parse(res))
})
</script>
</body>
</html>
//服务端
const http = require('http');
const https = require('https')
const reqOption = { // getman产生的虚拟数据的请求地址
protocol: 'https:',
host: 'getman.cn',
path: '/mock/shopList',
method: 'POST',
headers: {
"content-type": "application/json",
}
}
let server = http.createServer((req, res) => {
// 写请求头,解决跨域
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500'); // 若允许所有域名和ip,则设置成*
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
res.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
let _data = ''
req.on('data', data => _data += data)
req.on('end', () => {
proxyApi(_data).then((_res) => { // 服务端收到前端请求后,请求目标服务器,将结果返回至前端
res.write(_res)
res.end()
})
})
})
function proxyApi(_data) {
return new Promise((resolve, reject) => {
let req = https.request(reqOption, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
resolve(data)
});
})
req.write(_data)
req.end();
})
}
server.listen(1024, () => console.log("1024服务开启,开始侦听"));
Node事件循环的流程是什么,在事件循环中,如何判断是否有事件需要处理呢
事件循环的流程:在进程启动时,node会生成一个循环(类似于while(true)),每执行一次循环被称为一次Tick,每次的循环体Tick的过程会对事件进行判断,若发现存在事件,则执行相关操作,并进入下一个Tick,如果不再有事件,则退出进程
判断Tick是否有事件:node中的Tick通过观察者判断是否有需要处理的事件,主要来源于网络请求的网络I/O观察者,和文件操作的文件I/O观察者,事件循环从观察者中取出事件并处理
webSocket相对http的优势
简述明文、密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书的概念
什么是中间件,好处是什么
中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。使用node作为中间件更好提升了性能。
好处:
node中的Connect模块是什么,Koa与Express的中间件有什么区别
Connect是一个node中间件(middleware)框架,每个中间件在http处理过程中通过改写request或(和)response的数据、状态,实现了特定的功能
Koa与Express中间件的区别:
Express主要基于Connect中间件框架,中间件一个接一个的顺序执行,通常会将 response 响应写在最后一个中间件中
而koa主要基于co中间件框架,它的中间件是通过 async await
实现的,中间件执行顺序是“洋葱圈”模型。执行效果类似于Promise.all
文章浏览阅读1.1k次。client的设置方法:region = wl_compositor_create_region(window->display->compositor);wl_region_add(region, 0, 0, window->geometry.width, window->geometry.height);wl_surface_set_opaque_region(window->surface, region);wl_region_de_pixman_region32_intersect
文章浏览阅读7.7k次。满意答案a19850429推荐于 2016.11.30采纳率:47%等级:8已帮助:862人一般来说用dec2hex及hex2dec就可以。ss='010600001388849C';ssDec = hex2dec(ss);ssHex = dec2hex(ssDec);format hex;disp(ssHex);不过前提是你的机器能处理这么大的数。我用小一点的数比如说ss='01600..._matlab将sym类型变为double类型
文章浏览阅读4.4w次,点赞27次,收藏178次。一、第三范式(3NF)——相对于BCNF,允许存在主属性对候选码的传递依赖和部分依赖定义:如果关系模式R∈2NF,且每个非主属性都不传递函数依赖于R的主关系键,则称R属于第三范式,简称3NF。1、把一个关系模式分解成3NF,使它具有保持函数依赖性算法如下:其中提到了最小函数依赖集,那么最小函数依赖集怎么求呢?方法如下:举个例子:在R(U,F)中,U=ABCDEG,F={B→D,_4nf
文章浏览阅读7.8k次。oracle表给用户授权1、命令:grant xxx权限 on Table to USERgrant select,insert,update,delete,all on 表名 to 用户名例如:将test表的查询权限赋予tom这个用户grant select on test to tom2、被授权用户访问的时候需要在表前面添加授权用户名。select * from JF_CCJ.u..._grant select on table to user
文章浏览阅读4.8k次。IMG->Materials Management->Logistics Invoice Verification->Incoming Invoice->Maintain Item List Variantst-code: OLMRLIST_miro字段控制
文章浏览阅读667次。辅助dns集群数据不同步问题的解决方案原本111改称122[root@server12 slaves]# cat /etc/resolv.confnameserver 172.25.254.100[root@server12 slaves]# dig www.westos.orgbbs.westos.org. 86400 IN A 172.25.138.122bbs.westos.org. 86400 IN A 1..._域控dns记录不同步
文章浏览阅读1.6w次,点赞29次,收藏145次。测试工作是,解决玩家所遇非正常问题的预测工作,同时也是不断调试平衡的一个长期观察任务。无论在什么时间段,功能实现、内测、公测等。测试都应该是分硬件与软件两部分测试。硬性问题硬件的BUG部分是指会引起不能让游戏流程进行的BUG。死机、画面出错等硬性问题。这种问题只要按照一定流程进行游戏,就会发生。但对一些会不断增加服务器负担的高级BUG,应该不会短期测试出来。而对这种在有计算机就出现的问题,现在的游戏在制作过程中都有可自动记录问题的LOG功能,所出现的BUG大多会被程序部门解决掉。部分的LOG功能可。..._游戏测试
文章浏览阅读182次。vxe-grid 表格中 分页下序号连续展示,以及 seqMethod 里的 this 不生效 的解决方法。_vxe-grid 个性化列怎么不展示序号列
文章浏览阅读2.7k次。一、USB驱动层次usb采用树形拓扑结构,可分为主机侧与设备侧,每一条USB总线上只有一个主机控制器,负责协调主机与设备之间的通讯,设备不能主动的向主机发送任何消息,如下图所示如上图所示,从主机侧视角去看,在linux驱动中,usb驱动处于最上层,主要表现为usb主机侧的功能具体实现(比如U盘,鼠标,usb camer等),其下为usb核心层,主要完成usb驱动管理以及协议处理,再下为usb..._usb传输中pipe与urb的关系
文章浏览阅读7.9k次,点赞23次,收藏249次。ARM+Linux嵌入式底层内核驱动方向学习总体路线图 基础学习Ⅰ---Linux入门 目前嵌入式主要开发环境有 Linux、Wince等;Linux因其开源、开发操作便利而被广泛采用。而Linux操作系 统也只是一个简单的操作系统,简单的使用对于嵌入式开发人 员来说价值并不很高,真正有价值的是掌握Lin..._嵌入式学习路线
文章浏览阅读9.3k次。一.Introduction An RTCP implementation has three parts: the packet formats, the timing rules, and the participant database Packet Formats: Timing Rules: 所有的RTCP复合包被周期性送出,这个周期成为reporting interval,所有的R_rtcp实现
文章浏览阅读572次。 大家都在谈缘分,缘分是什么,谁也不知道,但总会经历。 三年前,我们相遇了,不过是同学介绍的。我约她出来了,我想再见她一面,因为我在之前已经看见过她,我知道她是我想要的人。不过我知道,她那时候喜欢另外一个叫宋的男孩,因为我的同学是他的老乡,他告诉我她和宋关系特别好。 那天晚上,我见到了她。穿着一件红色的上衣,背着黑色的小背包,脖子上带着很大一串项链。可是