一些可能会用到的Node.js面试题


Posted in Javascript onJune 15, 2019

前言

从ECMAScript标准,Node.js语法以及NPM模块角度来看,Node.js的发展让人目不暇接,那么面试题也得与时俱进。

问题

  • 什么是错误优先的回调函数?
  • 如何避免回调地狱?
  • 什么是Promise?
  • 用什么工具保证一致的代码风格?为什么要这样?
  • 什么是Stub?举例说明
  • 什么是测试金字塔?举例说明
  • 最喜欢哪个HTTP框架?为什么?
  • Cookies如何防范XSS攻击?
  • 如何保证依赖的安全性?

答案

1. 什么是错误优先的回调函数?

错误优先的回调函数(Error-First Callback)用于同时返回错误和数据。第一个参数返回错误,并且验证它是否出错;其他参数用于返回数据。

fs.readFile(filePath, function(err, data)
{
if (err)
{
// 处理错误
return console.log(err);
}
console.log(data);
});

2. 如何避免回调地狱?

以下方式可以避免回调地狱:

  • 模块化: 将回调函数转换为独立的函数
  • 使用流程控制库,例如aync
  • 使用Promise
  • 使用aync/await

3. 什么是Promise?

Promise可以帮助我们更好地处理异步操作。下面的示例中,100ms后会打印result字符串。catch用于错误处理。多个Promise可以链接起来。

new Promise((resolve, reject) =>
{
setTimeout(() =>
{
resolve('result');
}, 100)
})
.then(console.log)
.catch(console.error);

4. 用什么工具保证一致的代码风格?为什么要这样?

团队协作时,保证一致的代码风格是非常重要的,这样团队成员才可以更快地修改代码,而不需要每次去适应新的风格。这些工具可以帮助我们:

  • ESLint
  • Standard

5. 什么是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();

6. 什么是测试金字塔?举例说明

测试金字塔反映了需要写的单元测试、集成测试以及端到端测试的比例:

一些可能会用到的Node.js面试题

测试HTTP接口时应该是这样的:

  • 很多单元测试,分别测试各个模块(依赖需要stub)
  • 较少的集成测试,测试各个模块之间的交互(依赖不能stub)
  • 少量端到端测试,去调用真正地接口(依赖不能stub)

7. 最喜欢哪个HTTP框架?为什么?

这个问题标准答案。需要描述框架的优缺点,这样可以反映开发者对框架的熟悉程度。

8. Cookies如何防范XSS攻击?

XSS(Cross-Site Scripting,跨站脚本攻击)是指攻击者在返回的HTML中插入JavaScript脚本。为了减轻这些攻击,需要在HTTP头部配置set-cookie:

  • HttpOnly - 这个属性可以防止cross-site scripting,因为它会禁止Javascript脚本访问cookie。
  • secure - 这个属性告诉浏览器仅在请求为HTTPS时发送cookie。

结果应该是这样的: Set-Cookie: sid=; HttpOnly. 使用Express的话,cookie-session默认配置好了。

9. 如何保证依赖的安全性?

编写Node.js应用时,很可能依赖成百上千的模块。例如,使用了Express的话,会直接依赖27个模块。因此,手动检查所有依赖是不现实的。唯一的办法是对依赖进行自动化的安全检查,有这些工具可供选择:

  • npm outdated
  • Trace by RisingStack
  • NSP
  • GreenKeeper
  • Snyk

附加题

1. 这段代码有什么问题?

new Promise((resolve, reject) =>
{
throw new Error('error')
})
.then(console.log)

then之后没有catch。这样的话,错误会被忽略。可以这样解决问题:

new Promise((resolve, reject) =>
{
throw new Error('error')
})
.then(console.log).catch(console.error)

调试一个大型的项目时,可以使用监控unhandledRejection事件来捕获所有未处理的Promise错误:

process.on('unhandledRejection', (err) =>
{
console.log(err)
})

2. 这段代码有什么问题?

function checkApiKey(apiKeyFromDb, apiKeyReceived)
{
if (apiKeyFromDb === apiKeyReceived)
{
return true
}
return false
}

比较密码时,不能泄露任何信息,因此比较必须在固定时间完成。否则,可以使用timing attacks来攻击你的应用。为什么会这样呢?Node.js使用V8引擎,它会从性能角度优化代码。它会逐个比较字符串的字母,一旦发现不匹配时就停止比较。当攻击者的密码更准确时,比较的时间越长。因此,攻击者可以通过比较的时间长短来判断密码的正确性。使用cryptiles可以解决这个问题:

function checkApiKey(apiKeyFromDb, apiKeyReceived)
{
return cryptiles.fixedTimeComparison(apiKeyFromDb, apiKeyReceived)
}

3. 这段代码的输出是什么?

Promise.resolve(1)
.then((x) => x + 1)
.then((x) => { throw new Error('My Error') })
.catch(() => 1)
.then((x) => x + 1)
.then((x) => console.log(x))
.catch(console.error)

答案是2,逐行解释如下:

  1. 创建新的Promise,resolve值为1。
  2. x为1,加1之后返回2。
  3. x为2,但是没有用到。抛出一个错误。
  4. 捕获错误,但是没有处理。返回1。
  5. x为1,加1之后返回2。
  6. x为2,打印2。
  7. 不会执行,因为没有错误抛出。

英文: Node.js Interview Questions and Answers (2017 Edition)

译者: Fundebug

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
引用外部脚本时script标签关闭的写法
Jan 20 Javascript
Javascript 按位与运算符 (&)使用介绍
Feb 04 Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
Mar 03 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
js完整倒计时代码分享
Sep 18 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 Javascript
AngularJS 验证码60秒倒计时功能的实现
Jun 05 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
Sep 03 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
Nov 21 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 #Javascript
通过实例讲解JS如何防抖动
Jun 15 #Javascript
js笔试题-接收get请求参数
Jun 15 #Javascript
深入了解JavaScript 的 WebAssembly
Jun 15 #Javascript
通过实例了解js函数中参数的传递
Jun 15 #Javascript
RxJS的入门指引和初步应用
Jun 15 #Javascript
js中let能否完全替代IIFE
Jun 15 #Javascript
You might like
php下目前为目最全的CURL中文说明
2010/08/01 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
python和php哪个更适合写爬虫
2020/06/22 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
英国电子专家:maplin
2019/09/04 全球购物
法务专员岗位职责
2014/01/02 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
学生检讨书范文
2014/10/30 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
初三英语教学反思
2016/02/15 职场文书
python前后端自定义分页器
2022/04/13 Python