宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2021-08-22

前言

从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

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

更多资讯
游戏推荐
更多+