侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

前端  /  管理员 发布于 5年前   269

前言

从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. 什么是测试金字塔?举例说明

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

测试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

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

您可能感兴趣的文章:

  • 总结几道关于Node.js的面试问题
  • 通过Nodejs搭建网站简单实现注册登录流程
  • 解决Node.js mysql客户端不支持认证协议引发的问题
  • NodeJs生成sitemap站点地图的方法示例


  • 上一条:
    使用Vue.js 和Chart.js制作绚丽多彩的图表
    下一条:
    JavaScript的Proxy可以做哪些有意思的事儿
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客