前言
从ECMAScript标准、Node.js语法和NPM模块来看,Node.js的发展令人目不暇接,所以面试题一定要与时俱进。
问题
什么是错误优先回调函数?如何避免打回地狱?什么是承诺?使用什么工具来确保一致的代码风格?你为什么想要这个?什么是存根?举例说明什么是测试金字塔。举一个你最喜欢哪个HTTP框架的例子。为什么呢?Cookies如何防止XSS攻击?如何保证依赖关系的安全性?回答
1.什么是错误优先回调函数?
错误-第一次回调用于返回错误和数据。第一个参数返回错误,并验证是否错误;其他参数用于返回数据。
fs.readfile (filepath,函数(err,data){ if(err){//处理错误返回console . log(err);}console.log(数据);});2.如何避免回调到地狱?
以下方法可以避免回电地狱:
模块化:将回调函数转换为独立函数,并使用过程控制库。例如,aync使用Promise和aync/await3。什么是承诺?
Promise可以帮助我们更好地处理异步操作。在以下示例中,结果字符串在100毫秒后打印。Catch用于错误处理。可以链接多个承诺。
新承诺((解决,拒绝)={ setTimeout(()={解决('结果'));}, 100)}).然后(console.log)。catch(console . error);4.使用什么工具来确保一致的代码风格?你为什么想要这个?
在团队中工作时,确保一致的代码风格非常重要,这样团队成员就可以更快地修改代码,而不必每次都适应新的风格。这些工具可以帮助我们:
ESLint标准5。什么是存根?说明
存根用于模拟模块的行为。测试时,Stub可以返回函数调用的模拟结果。比如我们写文档的时候,其实并不需要写。
var fs=require(' fs ');var writeFileStub=sinon.stub(fs,' writeFile ',函数(路径,数据,CB){ return CB(null);});expect(WritefileStub). to . be . called;writefilestub . restore();6.什么是测试金字塔?说明
测试金字塔反映了需要编写的单元测试、集成测试和端到端测试的比例。
测试HTTP接口时,应该是这样的:
许多单元测试分别测试每个模块(取决于存根的需要),较少的集成测试测试,测试每个模块之间的交互(取决于存根的需要),少数端到端测试调用真实接口(取决于存根的需要)。7.你最喜欢哪个HTTP框架?为什么呢?
这个问题的标准答案。需要描述框架的优缺点,可以反映出开发者对框架的熟悉程度。
8.cookies如何防止XSS攻击?
XSS(跨站点脚本)指的是攻击者在返回的HTML中插入JavaScript脚本。为了减轻这些攻击,需要在HTTP头中配置set-cookie:
这个属性防止跨站点脚本,因为它防止Javascript脚本访问cookie。安全-这个属性告诉浏览器只有当请求是HTTPS时才发送cookie。结果应该是这样的: Set-cookie : sid=;HttpOnly。如果使用快速,默认情况下会配置cookie会话。
9.如何保证依赖的安全性?
在编写Node.js应用程序时,很可能依赖数百个模块。比如使用Express,就直接依赖27个模块。因此,手动检查所有依赖关系是不现实的。唯一的方法是自动检查依赖关系的安全性。有这些工具可供选择:
NPM的附加问题,由上升栈NSP绿色守护者snyk追溯
1.这个代码有什么问题?
newpromise((解析,拒绝)={throw newerror ('error')})后没有catch。然后(console.log)然后。这样,错误就会被忽略。你可以这样解决问题:
新承诺((解决,拒绝)={抛出新错误('错误')})。然后(console.log)。catch (console.error)调试大型项目时,可以使用监视unhandledRejection事件来捕获所有未处理的承诺错误3360。
Process.on('未处理的拒绝',(err)={console.log (err)}) 2。这个代码有什么问题?
函数checkapikey (apikeyfromdb,apikey received){ if(apikey from db==apikey received){ return true } return false }在比较密码时不能透露任何信息,因此必须在固定时间完成比较。否则,您可以使用定时攻击来攻击应用程序。为什么会这样?Node.js使用V8引擎,从性能角度优化了代码。它逐个比较字符串的字母,一旦发现不匹配,就停止比较。攻击者的密码越准确,比较时间越长。因此,攻击者可以通过比较时间长度来判断密码的正确性。使用密码可以解决这个问题:
函数checkapikey (apikeyfromdb,apikey received){ return crypt les。fixedtimecomparison(apikeyfromdb,apikeyreceived)} 3。这段代码的输出是什么?
答应我。解决(1)。然后((x)=x ^ 1)。然后((x)={抛出新错误('我的错误')})。catch (()=1)。然后((x)=x ^ 1)。然后((x)=控制台
创建一个解析值为1的新承诺。x是1,加1后返回2。x是2,但没有使用。抛出一个错误。发现错误,但未处理。返回1。x是1,加1后返回2。x是2,打印2。不会执行,因为没有抛出错误。英语: node.js面试问答(2017版)
翻译: Fundebug
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。