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

2020-06-17 06:40:46易采站长站整理

前言

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

问题

什么是错误优先的回调函数?
如何避免回调地狱?
什么是Promise?
用什么工具保证一致的代码风格?为什么要这样?
什么是Stub?举例说明
什么是测试金字塔?举例说明
最喜欢哪个HTTP框架?为什么?
Cookies如何防范XSS攻击?
如何保证依赖的安全性?

答案

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

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


fs.readFile(filePath, function(err, data)
{
if (err)
{
// 处理错误
return console.log(err);
}
console.log(data);
});

2. 如何避免回调地狱?

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

模块化: 将回调函数转换为独立的函数
使用流程控制库,例如aync
使用Promise
使用aync/await

3. 什么是Promise?

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


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

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

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

ESLint
Standard

5. 什么是Stub?举例说明

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();

6. 什么是测试金字塔?举例说明

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

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

很多单元测试,分别测试各个模块(依赖需要stub)
较少的集成测试,测试各个模块之间的交互(依赖不能stub)
少量端到端测试,去调用真正地接口(依赖不能stub)