Node.JS 面试会问什么? 下面本篇文章给大家分享一些常见 Node.JS 面试题. 有一定的参考价值, 有需要的朋友可以参考一下, 希望对大家有所帮助.
1, 为什么用 Node.JS, 它有哪些缺点?
事件驱动, 通过闭包很容易实现客户端的生命活期.
不用担心多线程, 锁, 并行计算的问题
V8 引擎速度非常快
对于游戏来说, 写一遍游戏逻辑代码, 前端后端通用
当然 Node.JS 也有一些缺点:
Node.JS 更新很快, 可能会出现版本兼容
Node.JS 还不算成熟, 还没有大制作
Node.JS 不像其他的服务器, 对于不同的链接, 不支持进程和线程操作
2, 什么是错误优先的回调函数?
错误优先 (Error-first) 的回调函数 (Error-First Callback) 用于同时返回错误和数据. 第一个参数返回错误, 并且验证它是否出错; 其他参数返回数据.
- fs.readFile(filePath, function(err, data)
- {
- if (err)
- {
- // 处理错误
- return console.log(err);
- }
- console.log(data);
- });
3, 如何避免回调地狱?
以下方式避免回调地狱
模块化: 将回调函数转换为独立的函数
使用流程控制库, 例如[aync]
使用 Promise
使用 aync/await
4, 什么是 Promise?
Promise 可以帮助我们更好地处理异步操作. 下面的实例中, 100ms 后会打印 result 字符串. catch 用于错误处理. 多个 Promise 可以链接起来.
- new Promise((resolve, reject) =>
- {
- setTimeout(() =>
- {
- resolve('result');
- }, 100)
- })
- .then(console.log)
- .catch(console.error);
5, 用什么工具保证一致的代码风格? 为什么要这样?
团队协作时, 保证一致的代码风格是非常重要的, 这样团队成员才可以更快地修改代码, 而不需要每次去适应新的风格. 这些工具可以帮助我们:
- [ESLint] (http://eslint.org/)
- [Standard] (https://standardjs.com/)
- JSLint
- JSHint
- ESLint
JSCS 推荐
6, 什么是 stub? 举例说明
stub 用于模块的行为. 测试时, stub 可以为函数调用返回模拟的结果. 比如说, 我们写文件时, 实际上并不需要真正去写.
- var fs = require('fs');
- var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb)
- {
- return cb(null);
- });
- expect(writeFileStub).to.be.called;
- writeFileStub.restore();
7, 什么是测试金字塔? 举例说明
测试金字塔反应了需要写的单元测试, 集成测试以及端到端测试的比例:
测试 HTTP 接口时应该是这样的:
很多单元测试, 分别测试各个模块(依赖需要 stub)
较少的集成测试, 测试各个模块之间的交互(依赖不能 stub)
少量端到端测试, 去调用真正地接口(依赖不能 stub)
8, 如何用 Node 监听 80 端口
这题有陷阱! 在类 Unix 系统中你不应该去监听 80 端口, 因为这需要超级用户权限. 因此不推荐让你的应用直接监听这个端口.
目前, 如果你一定要让你的应用 80 端口的话, 你可以有通过在 Node 应用的前方再添加一层反向代理 (例如 nginx) 来实现, 如下图. 否则, 建议你直接监听大于 1024 的端口
方向代理指的是以代理服务器来接收 Internet 上的连接请求, 然后将请求转发给内部网络上的服务器, 并且将服务器返回的结果发送给客户端.
9, 什么是事件循环
Node 采用的是单线程的处理机制(所有的 I/O 请求都采用非阻塞的工作方式), 至少从 Node.JS 开发者的角度是这样的. 而在底层, Node.JS 借助 libuv 来作为抽象封装层, 从而屏蔽不同操作系统的差异, Node 可以借助 livuv 来实现线程. 下图表示 Node 和 libuv 的关系
Libuv 库负责 Node API 的执行. 它将不同的任务分配给不同的线程, 形成一个事件循环, 以异步的方式将任务的执行结果返回给 V8 引擎. 可以简单用下面这张图来表示
每一个 I/O 都需要一个回调函数 ---- 一旦执行完便堆到事件循环上用于执行
10, 运算错误与程序员错误的区别
运算错误并不是 bug, 这是和系统相关的问题, 例如请求超时或者硬件故障. 而程序员错误就是所谓的 bug
11, 使用 NPM 有哪些好处?
通过 NPM, 你可以安装和管理项目的依赖, 并且能够指明依赖项的具体版本号. 对于 Node 应用开发而言, 你可以通过 package.JSON 文件来管理项目信息, 配置脚本, 以及指明依赖的具体版本
12, 什么是 stub? 举个使用场景
stub 是用于模拟一个组件或模块的函数或程序. 在测试用例中, 简单的说, 你可以用 stub 去模拟一个方法, 从而避免调用真实的方法, 使用 stub 你还可以返回虚构的结果. 你可以配合断言使用 stub.
举个例子, 在一个读取文件的场景中, 当你不想读取一个真正的文件时:
- var fs = require('fs');
- var readFileStub = sinon.stub(fs,'readFile',function(path,cb) {
- return cb(null, 'filecontent');
- });
- expect(readFileStub).to.be.called;
- readFileStub.restore();
在单元测试中: Stub 是完全模拟一个外部依赖, 而 Mock 常用来判断测试通过还是失败
来源: http://www.css88.com/qa/node-js/14900.html