总结几道关于Node.js的面试问题


Posted in Javascript onJanuary 11, 2017

什么是error-first的回调方式

Error-first回调方式用来同时传递error和data。将错误作为第一个参数,它就必须先检查看看有没有错误先。另外的参数就用来传递data了。

fs.readFile(filePath, function(err, data) {
 if(err) {
  //处理错误,这里的return很重要,如果发生错误,在此处就会停止了。
  return console.log(err);
 }
 //传递data
 console.log(data);
})

你是如何避免回调地狱的?

  1. 模块化 把回调函数分割成独立的函数
  2. 使用控制流的库,比如async
  3. generators结合Promise
  4. async/await

Promise是什么?

概念不多说了,简单来说就是帮助你更好地处理异步操作的东西。

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

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();

如何保证你的HTTP cookies安全不受XSS攻击

在set-cookieHTTP头部加上这几个信息:

  1. HttpOnly-这个属性用来防止跨站脚本攻击,它不允许cookie被JavaScript代码获取。
  2. secure-这个属性告诉浏览器只有在HTTPS连接时才发送cookie

像这样:Set-Cookit: sid=<cookit-value>; HttpOnly

下面这段代码有什么问题

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)

如果你正在调试一个大型项目,你不知道哪个Promise可能会有问题,可以使用unhandledRejection。它会打印出所有未经处理的Promise异常

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

下面的代码有什么问题?

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

说实话我刚看到的时候也是一脸懵逼,这有啥问题?不是很正常的一个if else代码吗。

不过这不是普通的if else代码,这是用来比较安全证书的代码,这个时候你不能泄露一丁点的信息,所以确保他们在一定的时间内进行比较。否则的你的应用就可能受到时序攻击了。

什么是时序攻击(timing attacks)?Node.js使用的V8引擎试图从表示层面上优化代码。它一个字符一个字符地比较,一旦找到不符合它就停止比较。

你可以使用cryptiles这个npm模块来解决这个问题

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

如何通俗地解释时序攻击(timing attack)?

时序攻击属于侧信道攻击/旁路攻击(Side Channel Attack),侧信道攻击是指利用信道外的信息,比如加解密的速度/加解密时芯片引脚的电压/密文传输的流量和途径等进行攻击的方式,一个词形容就是“旁敲侧击”。

举一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。

最简单的防御方法是:“发现错误的时候并不立即返回,而是设一个标志位,直到完全比较完两个字符串再返回”。

时序攻击并非是一种理论攻击方法,OpenSSL、OpenSSH等应用都曾经有时序攻击漏洞,举个实际的例子吧:

总结几道关于Node.js的面试问题

下面的代码会输出什么

Promise.reso(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)
  1. 一个新的Promise被创造出来,它会解析参数1
  2. 解析后的值会被加上1(现在是2),并立即返回了这个2
  3. 解析的值被丢弃,抛出一个异常
  4. 异常被丢弃,新的值1被返回
  5. catch后运行不会停止,在异常处理之前,它继续运行,一个新的,增加了1后的值2被返回
  6. 返回值被打印出来
  7. 这一行不会运行,因为没有异常

总结

以上就是关于Node.js的几道面试题,希望本文的内容对大家能有所帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Js 获取当前日期时间及其它操作实现代码
Mar 04 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
May 28 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
Oct 11 Javascript
基于jQuery实现的旋转彩圈实例
Jun 26 Javascript
基于javascript实现九九乘法表
Mar 27 Javascript
JS获取随机数和时间转换的简单实例
Jul 10 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
微信小程序文章详情页跳转案例详解
Jul 09 Javascript
vue 解决文本框被键盘遮住的问题
Nov 06 Javascript
Vue 实现登录界面验证码功能
Jan 03 Javascript
js实现弹幕墙效果
Dec 10 Javascript
微信端开发--登录小程序步骤
Jan 11 #Javascript
Vue数据驱动模拟实现1
Jan 11 #Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 #Javascript
详解js前端代码异常监控
Jan 11 #Javascript
Vue数据驱动模拟实现3
Jan 11 #Javascript
jQuery实现判断控件是否显示的方法
Jan 11 #Javascript
jQuery Form表单取值的方法
Jan 11 #Javascript
You might like
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
解决python删除文件的权限错误问题
2018/04/24 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
python实现各种插值法(数值分析)
2019/07/30 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
介绍一下XMLHttpRequest对象
2012/02/12 面试题
应届毕业生的自我鉴定
2013/11/13 职场文书
2014自主招生自荐信策略
2014/01/27 职场文书
教师师德反思材料
2014/02/15 职场文书
决心书格式范文
2015/09/23 职场文书
安全教育培训心得体会
2016/01/15 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB