源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

总结几道关于Node.js的面试问题

  • 时间:2020-05-10 07:42 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:总结几道关于Node.js的面试问题
[b]什么是error-first的回调方式[/b] Error-first回调方式用来同时传递error和data。将错误作为第一个参数,它就必须先检查看看有没有错误先。另外的参数就用来传递data了。
fs.readFile(filePath, function(err, data) {
 if(err) {
  //处理错误,这里的return很重要,如果发生错误,在此处就会停止了。
  return console.log(err);
 }
 //传递data
 console.log(data);
})
[b]你是如何避免回调地狱的?[/b] [list=1] [*]模块化 把回调函数分割成独立的函数[/*] [*]使用控制流的库,比如[url=https://www.npmjs.com/package/async]async[/url][/*] [*]generators结合Promise[/*] [*]async/await [/*] [/list] [b]Promise是什么?[/b] 概念不多说了,简单来说就是帮助你更好地处理异步操作的东西。
new Promise((resolve, reject) => {
 setTimeout(() => {
  resolve('result');
 }, 100)
})
 .then(console.log)
 .catch(console.error)
[b]stub是什么? 举个例子?[/b] 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();
[b]如何保证你的HTTP cookies安全不受XSS攻击[/b] 在set-cookieHTTP头部加上这几个信息: [list=1] [*]HttpOnly-这个属性用来防止跨站脚本攻击,它不允许cookie被JavaScript代码获取。[/*] [*]secure-这个属性告诉浏览器只有在HTTPS连接时才发送cookie[/*] [/list] 像这样:[code]Set-Cookit: sid=<cookit-value>; HttpOnly[/code] [b]下面这段代码有什么问题[/b]
new Promise((resolve, reject) => {
 throw new Error('error')
}).then(console.log)
then后面没有跟上catch,这样的话如果出错的这段代码还是默默地运行,并不会告诉你哪里出错了。 [b]修改后:[/b]
new Promise((resolve, reject) => {
 throw new Error('error')
}).then(console.log).catch(console.error)
如果你正在调试一个大型项目,你不知道哪个Promise可能会有问题,可以使用unhandledRejection。它会打印出所有未经处理的Promise异常
process.on('unhandledRejection', (err) => {
 console.log(err)
})
[b]下面的代码有什么问题?[/b]
function checkApiKey(apiKeyFromDb, apiKeyReceived) {
 if (apiKeyFromDb === apiKeyReceived) {
  return true
 }
 return false
}
说实话我刚看到的时候也是一脸懵逼,这有啥问题?不是很正常的一个if else代码吗。 不过这不是普通的if else代码,这是用来比较安全证书的代码,这个时候你不能泄露一丁点的信息,所以确保他们在一定的时间内进行比较。否则的你的应用就可能受到时序攻击了。 什么是时序攻击([url=https://en.wikipedia.org/wiki/Timing_attack]timing attacks[/url])?Node.js使用的V8引擎试图从表示层面上优化代码。它一个字符一个字符地比较,一旦找到不符合它就停止比较。 你可以使用[url=https://www.npmjs.com/package/cryptiles]cryptiles[/url]这个npm模块来解决这个问题
function checkApiKey(apiKeyFromDb, apiKeyReceived) {
 return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived)
}
[b]如何通俗地解释时序攻击(timing attack)?[/b] 时序攻击属于侧信道攻击/旁路攻击(Side Channel Attack),侧信道攻击是指利用信道外的信息,比如加解密的速度/加解密时芯片引脚的电压/密文传输的流量和途径等进行攻击的方式,一个词形容就是“旁敲侧击”。 举一个最简单的计时攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。密码破解复杂度成千上万倍甚至百万千万倍的下降。 最简单的防御方法是:“发现错误的时候并不立即返回,而是设一个标志位,直到完全比较完两个字符串再返回”。 时序攻击并非是一种理论攻击方法,OpenSSL、OpenSSH等应用都曾经有时序攻击漏洞,举个实际的例子吧: [img]http://files.jb51.net/file_images/article/201701/201711195639178.jpg?201701195651[/img] [b]下面的代码会输出什么[/b]
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) 
[list=1] [*]一个新的Promise被创造出来,它会解析参数1[/*] [*]解析后的值会被加上1(现在是2),并立即返回了这个2[/*] [*]解析的值被丢弃,抛出一个异常[/*] [*]异常被丢弃,新的值1被返回[/*] [*]catch后运行不会停止,在异常处理之前,它继续运行,一个新的,增加了1后的值2被返回[/*] [*]返回值被打印出来[/*] [*]这一行不会运行,因为没有异常[/*] [/list] [b]总结[/b] 以上就是关于Node.js的几道面试题,希望本文的内容对大家能有所帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部