node.js面试笔记

一、为何用Nodejs,它有哪些缺点?前端

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

固然Nodejs也有一些缺点:
nodejs更新很快,可能会出现版本兼容
nodejs还不算成熟,尚未大制做
nodejs不像其余的服务器,对于不一样的连接,不支持进程和线程操做

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

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

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

三、如何避免回调地狱?后端

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

四、什么是Promise?服务器

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

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

五、用什么工具保证一致的代码风格?为何要这样?多线程

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

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

七、什么是测试金字塔?举例说明异步

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