node.js面试笔记

1、为什么用Nodejs,它有哪些缺点?

事件驱动,通过闭包很容易实现客户端的生命活期。
不用担心多线程,锁,并行计算的问题
V8引擎速度非常快
对于游戏来说,写一遍游戏逻辑代码,前端后端通用

当然Nodejs也有一些缺点:
nodejs更新很快,可能会出现版本兼容
nodejs还不算成熟,还没有大制作
nodejs不像其他的服务器,对于不同的链接,不支持进程和线程操作

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

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

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

3、如何避免回调地狱?

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

4、什么是Promise?

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

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

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

团队协作时,保证一致的代码风格是非常重要的,这样团队成员才可以更快地修改代码,而不需要每次去适应新的风格。这些工具可以帮助我们:
[ESLint] (http://eslint.org/)
[Standard] (https://standardjs.com/)
JSLint
JSHint
ESLint
JSCS推荐

6、什么是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();

7、什么是测试金字塔?举例说明

测试金字塔反应了需要写的单元测试,集成测试以及端到端测试的比例:
测试HTTP接口时应该是这样的:
很多单元测试,分别测试各个模块(依赖需要stub)
较少的集成测试,测试各个模块之间的交互(依赖不能stub)
少量端到端测试,去调用真正地接口(依赖不能stub)

相关推荐