[译]Node.js Interview Questions and Answers (2017 Edition)
Node.js Interview Questions for 2017
- 什么是error-first callback?
- 如何避免无止境的callback?
- 什么是Promises?
- 用什么工具来保证代码的一致性风格? 为什么保持一致性风格很重要?
- When should you npm and when yarn?
- 什么是stub? 举个例子!
- 什么是test pyramid? 举个例子!
- 你喜欢哪个HTTP框架,为什么?
- 如何保护你的HTTP cookies 不遭受XSS攻击?
- 如何确保你的依赖是安全的?
什么是error-first callback
Error First callback用来传递error和data。 使用error作为第一个参数,要检查这个error参数看看是不是哪出错了。第二个参数用来传递data。
fs.readFile(filePath, function(err, data) {
if (err) {
// handle the error, the return is important here
// so execution stops here
return console.log(err)
}
// use the data object
console.log(data)
})
如何避免无止境的callback
有许多方法:
- modularization: break callbacks into independent functions
- 使用流控制库, 例如async
- 使用generators with Promises 详见
- 使用async/await(这个是v7才有的, 你可以看看我们关于async/await的实践)
什么是Promises
Promises帮助我们更好的处理异步操作。
下面的例子中100ms后打印一个result字符串。 注意到了catch没, 它用来处理错误。Promises是可链接式的。
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result')
}, 100)
})
.then(console.log)
.catch(console.error)
用什么工具来保证代码的一致性风格? 为什么保持一致性风格很重要
在一个团队中工作的时候,一致性风格尤为重要,这样团队成员可以更加简单的修改项目,不要每次都是用一个新的风格。
同时,借助于静态分析可以帮助消除issue。
可以使用以下工具:
什么是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()
什么是test pyramid? 举个例子
test pyramind描述所需单元测试,集成测试,End-to-End的比率。

你喜欢哪个HTTP框架,为什么
没有正确答案。目的是考察对某个框架的了解程度。
background/worker在什么时候有用? 你是如何处理worker task的
worker processes对于在后台进行数据处理非常有用,例如发送邮件或者处理图片。
如何保护你的HTTP cookies 不遭受XSS攻击
XSS是攻击者将可执行的js注入到你的系统中。
减少这种攻击,你应该设置HTTP请求头set-cookie:
- HttpOnly 用来阻止通过js来方位cookie
- secure 告诉浏览器只用在https的情况下才发送cookie
如果你用的是Express, 使用express-cookie session。
如何确保你的依赖是安全的
nodejs项目很容易就依赖上百上千个依赖包。 手工检查是不现实的。
我们可以自动更新、安全审查依赖。下面是一些免费和付费的方案:
npm outdated- Trace by RisingStack
- NSP
- GreenKeeper
- Snyk
面试题
下面的代码有什么问题?
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)
如果你在debug一个大项目,你不知道哪个Promise可能会有这个issue, 你可以使用unhandleRejection钩子。它会打印所用unhandled Promise。
process.on('unhandledRejection', (err) => {
console.log(err)
})
下面的代码有什么问题?
function checkApiKey (apiKeyFromDb, apiKeyReceived) {
if (apiKeyFromDb === apiKeyReceived) {
return true
}
return false
}
解决方案
比较安全凭证的关键是不泄露任何信息,你应该确保你在一个固定的时间段比较他们。 如果你不这么做你很容易遭受时序攻击(timing attacks)。
时序攻击属于侧信道攻击/旁路攻击(Side Channel Attack),侧信道攻击是指利用信道外的信息,比如加解密的速度/加解密时芯片引脚的电压/密文传输的流量和途径等进行攻击的方式,一个词形容就是“旁敲侧击”。
举一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。
最简单的防御方法是:“发现错误的时候并不立即返回,而是设一个标志位,直到完全比较完两个字符串再返回”。
时序攻击并非是一种理论攻击方法,OpenSSL、OpenSSH等应用都曾经有时序攻击漏洞,举个实际的例子吧:
作者:shotgun
链接:https://www.zhihu.com/question/20156213/answer/43377769
来源:知乎
你可以使用cryptiles来解决这个问题。
function checkApiKey (apiKeyFromDb, apiKeyReceived) {
return cryptiles.fixedTimeComparison(apiKeyFromDb, apiKeyReceived)
}
下面的代码将输出什么
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,看看为什么输出2:
- 新的Promise创建, resolve 1
- resolve加1,变成2
- 抛出一个异常
- 返回1
- 加1,变成2
- 打印出2
- 这行不会执行,因为没有异常
[译]Node.js Interview Questions and Answers (2017 Edition)的更多相关文章
- 101+ Manual and Automation Software Testing Interview Questions and Answers
101+ Manual and Automation Software Testing Interview Questions and Answers http://www.softwaretesti ...
- Top 25 Most Frequently Asked Interview Core Java Interview Questions And Answers
We are sharing 25 java interview questions , these questions are frequently asked by the recruiters. ...
- [译]Node.js - Event Loop
介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...
- 115 Java Interview Questions and Answers – The ULTIMATE List--reference
In this tutorial we will discuss about different types of questions that can be used in a Java inter ...
- 69 Spring Interview Questions and Answers – The ULTIMATE List--reference
This is a summary of some of the most important questions concerning the Spring Framework, that you ...
- 译\Node.js应用的持续部署
Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...
- [译]Node.js : Building RESTful APIs using Loopback and MySQL
国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...
- [译]Node.js Best Practices - Part 2
原文: https://blog.risingstack.com/node-js-best-practices-part-2/ 统一风格 在大团队开发JS应用, 创建一个风格指南是很有必要的. 推荐看 ...
- [译]Node.js面试问与答
原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...
随机推荐
- win10用户文件夹重命名,启用administrator账户,删除文件夹时提示找不到该项目
这一切都源自楼主洁癖一般的强迫症. 楼主在重置win10后的安装过程中用microsoft账户登录的电脑,发现用户文件夹名称怪怪的,于是想重命名一下.楼主发现重命名用户文件夹并不能简单地用F2搞定,于 ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- 扩大ubuntu虚拟机硬盘空间
一.背景: 出于测试的需要,在ubuntu 14.04系统中通过virtualbox虚拟机安装了额ubuntu 14.04系统(guest os).安装过程采用ubuntu 14.04的默认分区方法. ...
- gerrit 为每个工程设置提交的reviewer
尝试安装了 https://gerrit-ci.gerritforge.com/job/plugin-reviewers-stable-2.13/lastSuccessfulBuild/artifac ...
- 捕获起英文名Edda的灵感来源,我的心愿是程序员这个行业能够男女人数平衡
在腾讯的暑期训练营结识过不少鹅厂的前辈,他们对我的成长提供了很大的帮助,可以说有着知遇之恩,大部分现在还保持着联系,请教问题时会不吝赐教,以至于就在前两天11号企鹅18岁的成年礼,朋友圈刷满了领腾讯总 ...
- 基于C/S架构的3D对战网络游戏C++框架_03服务器端详细设计
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- tomcat启动报错: org.apache.catalina.deploy.WebXml addFilter
解决方法为:在Tomacat7的context.xml文件里的<Context>中加上<Loader delegate="true" />
- linux-crontab定时任务
crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行.通常 ...
- oracle数据查询
select * from XMBL_EM_DBBACK where f_djbh='DB01201612270013'select * from flow_task_list where biz_d ...
- js小练习去掉指定的字符组成一句话输出
今天在codewar做练习题时,要求写一个函数把一个字符串去掉WUB这些多余的字符然后把剩下的组成一句话输出,如传入"WUBAWUBBWUBCWUB"后返回"A B C& ...