总结几道关于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 进度条效果实现代码整理
May 21 Javascript
JS简单实现无缝滚动效果实例
Aug 24 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
Nov 29 Javascript
浅谈JavaScript中promise的使用
Jan 11 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
jQuery.Form上传文件操作
Feb 05 Javascript
分享一个精简的vue.js 图片lazyload插件实例
Mar 13 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
Sep 14 Javascript
基于Vue插入视频的2种方法小结
Apr 02 Javascript
js实现图片无缝循环轮播
Oct 28 Javascript
原生JavaScript之es6中Class的用法分析
Feb 23 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封装函数实现生成随机的字符串验证码
2017/01/24 PHP
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
python监控文件并且发送告警邮件
2018/06/21 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
汉语言文学专业自荐信
2014/06/11 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
二年级学生期末评语
2014/12/26 职场文书
投资申请报告
2015/05/19 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers