首页登陆欢迎您!
首页登陆 > 运维知识 > 总结几道关于Node.js的面试问题_node.js_脚本之家

总结几道关于Node.js的面试问题_node.js_脚本之家

时间:2019-12-12

什么是error-first的回调方式

译者按:ECMAScript标准Node.js语法以及NPM模块角度来看,Node.js的发展让人目不暇接,那么面试题也得与时俱进。

Error-first回调方式用来同时传递error和data。将错误作为第一个参数,它就必须先检查看看有没有错误先。另外的参数就用来传递data了。

原文: Node.js Interview Questions and Answers (2017 Edition)

fs.readFile(filePath, function { //处理错误,这里的return很重要,如果发生错误,在此处就会停止了。 return console.log; } //传递data console.log

译者: Fundebug

你是如何避免回调地狱的?

为了保证可读性,本文采用意译而非直译。

模块化 把回调函数分割成独立的函数 使用控制流的库,比如async generators结合Promise async/await

问题

Promise是什么?

- 什么是错误优先的回调函数?

概念不多说了,简单来说就是帮助你更好地处理异步操作的东西。

  • 如何避免回调地狱?
  • 什么是Promise?
  • 用什么工具保证一致的代码风格?为什么要这样?
  • 什么是Stub?举例说明
  • 什么是测试金字塔?举例说明
  • 最喜欢哪个HTTP框架?为什么?
  • Cookies如何防范XSS攻击?
  • 如何保证依赖的安全性?
new Promise => { setTimeout => { resolve .then .catch

答案

stub是什么? 举个例子?

1. 什么是错误优先的回调函数?

stub是用来模拟组件/模块行为的东西,它在测试阶段为函数调用提供内部响应。

错误优先的回调函数(Error-First Callback)用于同时返回错误和数据。第一个参数返回错误,并且验证它是否出错;其他参数用于返回数据。

例子是写文件,但实际上并没有这么做

 

var fs = require;var writeFileStub = sinon.stub(fs, 'writeFile', function { return cbexpect.to.be.calledwriteFileStub.restore();
fs.readFile(filePath, function(err, data)
{
if (err)
{
// 处理错误
return console.log(err);
}
console.log(data);
});

如何保证你的HTTP cookies安全不受XSS攻击

  

在set-cookieHTTP头部加上这几个信息:

2. 如何避免回调地狱?

HttpOnly-这个属性用来防止跨站脚本攻击,它不允许cookie被JavaScript代码获取。 secure-这个属性告诉浏览器只有在HTTPS连接时才发送cookie

以下方式可以避免回调地狱:

像这样:Set-Cookit: sid=; HttpOnly

- 模块化: 将回调函数转换为独立的函数

下面这段代码有什么问题

  • 使用流程控制库,例如[aync]()
  • 使用Promise

    使用aync/await(参考[Async/Await替代Promise的6个理由]())
new Promise => { throw new Error.then

3. 什么是Promise?

then后面没有跟上catch,这样的话如果出错的这段代码还是默默地运行,并不会告诉你哪里出错了。

Promise可以帮助我们更好地处理异步操作。下面的示例中,100ms后会打印result字符串。catch用于错误处理。多个Promise可以链接起来。

修改后:

 

new Promise => { throw new Error.then.catch
new Promise((resolve, reject) =>
{
setTimeout(() =>
{
resolve('result');
}, 100)
})
.then(console.log)
.catch(console.error);

如果你正在调试一个大型项目,你不知道哪个Promise可能会有问题,可以使用unhandledRejection。它会打印出所有未经处理的Promise异常

 

process.on('unhandledRejection',  => { console.log

4. 用什么工具保证一致的代码风格?为什么要这样?

下面的代码有什么问题?

团队协作时,保证一致的代码风格是非常重要的,这样团队成员才可以更快地修改代码,而不需要每次去适应新的风格。这些工具可以帮助我们:

function checkApiKey(apiKeyFromDb, apiKeyReceived) { if (apiKeyFromDb === apiKeyReceived) { return true } return false}

- [ESLint]()

说实话我刚看到的时候也是一脸懵逼,这有啥问题?不是很正常的一个if else代码吗。

  • [Standard]()

不过这不是普通的if else代码,这是用来比较安全证书的代码,这个时候你不能泄露一丁点的信息,所以确保他们在一定的时间内进行比较。否则的你的应用就可能受到时序攻击了。

感兴趣的话,可以参考JavaScript Clean Coding

什么是时序攻击?Node.js使用的V8引擎试图从表示层面上优化代码。它一个字符一个字符地比较,一旦找到不符合它就停止比较。

5. 什么是Stub?举例说明

你可以使用cryptiles这个npm模块来解决这个问题

Stub用于模拟模块的行为。测试时,Stub可以为函数调用返回模拟的结果。比如说,当我们写文件时,实际上并不需要真正去写。

function checkApiKey(apiKeyFromDb, apiKeyReceived) { return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived)}

 

如何通俗地解释时序攻击?

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

最简单的防御方法是:“发现错误的时候并不立即返回,而是设一个标志位,直到完全比较完两个字符串再返回”。

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

时序攻击并非是一种理论攻击方法,OpenSSL、OpenSSH等应用都曾经有时序攻击漏洞,举个实际的例子吧:

图片 1

下面的代码会输出什么

测试HTTP接口时应该是这样的:

Promise.reso => x + 1) .then => {throw new Error .catch => x + 1) .then) .catch 

- 很多单元测试,分别测试各个模块(依赖需要stub)

一个新的Promise被创造出来,它会解析参数1 解析后的值会被加上1,并立即返回了这个2 解析的值被丢弃,抛出一个异常 异常被丢弃,新的值1被返回 catch后运行不会停止,在异常处理之前,它继续运行,一个新的,增加了1后的值2被返回 返回值被打印出来 这一行不会运行,因为没有异常

  • 较少的集成测试,测试各个模块之间的交互(依赖不能stub)
  • 少量端到端测试,去调用真正地接口(依赖不能stub)

总结

7. 最喜欢哪个HTTP框架?为什么?

以上就是关于Node.js的几道面试题,希望本文的内容对大家能有所帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

这个问题标准答案。需要描述框架的优缺点,这样可以反映开发者对框架的熟悉程度。

8. Cookies如何防范XSS攻击?

XSS(Cross-Site Scripting,跨站脚本攻击)是指攻击者在返回的HTML中插入JavaScript脚本。为了减轻这些攻击,需要在HTTP头部配置set-cookie:

- HttpOnly - 这个属性可以防止cross-site scripting,因为它会禁止Javascript脚本访问cookie。

上一篇:运维知识【原】小搞一下 javascript算法 下一篇:没有了