node 怎么判断前端传过来的参数对象为空?_Node 常见面试题总结

7f4cba642c8ef15af912ba30155ce7c9.gif 阅读本文约需要9分钟

大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务!

1、长期为你提供最优质的学习资源!

2、给你解决技术问题!

3、每天在朋友圈里分享优质的技术文章!

4、每周1、3、5送纸质书籍免费送给大家,每年至少送书800本书!

5、为大家推荐靠谱的就业单位!

请注意!我上面说的5点全部都是免费的!全网你应该找不到第二家吧!

当然,大家在我私人微信上问我问题,仅限回答web前端、java相关的。

---------------------------

好了,接下来开始今天的技术分享!上次老师跟大家分享了Vue常见面试题的知识,今天跟大家分享下Node常见面试题的知识。 

1 Node常见面试题 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/)JSLintJSHintESLintJSCS推荐
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、什么是测试金字塔?举例说明 测试金字塔反应了需要写的单元测试,集成测试以及端到端测试的比例:

627b27bee40dbfefe55e26ba410591c5.png

测试 H TTP接口时应该是这样的: 很多单元测试,分别测试各个模块(依赖需要stub) 较少的集成测试,测试各个模块之间的交互(依赖不能stub) 少量端到端测试,去调用真正地接口(依赖不能stub) 8、如何用Node监听80端口 这题有陷阱! 在类Unix系统中你不应该去监听80端口,因为这需要超级用户权限。 因此不推荐让你的应用直接监听这个端口。 目前,如果你一定要让你的应用80端口的话,你可以有通过在Node应用的前方再添加一层反向代理(例如nginx)来实现,如下图。 否则,建议你直接监听大于1024的端口

8f80732e72aa27ebaa49dd520203adf8.png

方 向代理指的是以代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器, 并且将服务器返回的结果发送给客户端。 9、什么是事件循环 Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开发者的角度是这样的。 而在底层,Node.js借助libuv来作为抽象封装层,从而屏蔽不同操作系统的差异,Node可以借助livuv来实现线程。 下图表示Node和libuv的关系

c60d5ee6c343983113ac5344d2d524b6.png

Libuv库负责Node API的执行。 它将不同的任务分配给不同的线程,形成一个事件循环,以异步的方式将任务的执行结果返回给V8引擎。 可以简单用下面这张图来表示

00a35603f0ad1fb9ff74deb767a284b4.png

每一个I/O都需要一个回调函数————一旦执行完便堆到事件循环上用于执行 10、运算错误与程序员错误的区别 运算错误并不是bug,这是和系统相关的问题,例如请求超时或者硬件故障。 而程序员错误就是所谓的bug 11、使用NPM有哪些好处? 通过NPM,你可以安装和管理项目的依赖,并且能够指明依赖项的具体版本号。 对于Node应用开发而言,你可以通过package.json文件来管理项目信息,配置脚本,以及指明依赖的具体版本 12、什么是stub?举个使用场景 stub是用于模拟一个组件或模块的函数或程序。 在测试用例中,简单的说,你可以用stub去模拟一个方法,从而避免调用真实的方法,使用stub你还可以返回虚构的结果。 你可以配合断言使用stub。 举个例子,在一个读取文件的场景中,当你不想读取一个真正的文件时:
var fs = require('fs'); var readFileStub = sinon.stub(fs, 'readFile', function (path, cb) { return cb(null, 'filecontent'); }); expect(readFileStub).to.be.called; readFileStub.restore();
在单元测试中: Stub是完全模拟一个外部依赖,而Mock常用来判断测试通过还是失败 13、node有哪些特征,与其他服务器端对比 特征: 单线程、事件驱动、非阻塞I/O node 无法直接渲染静态页面,提供静态服务 node 没有根目录的概念 node 必须通过路由程序指定文件才能渲染文件 node 比其他服务端性能更好,速度更快 14、CommonJS中require/exports和ES6中import/export区别 CommonJS模块的重要特性是加载时执行,及脚本代码在require的时候,就会全部执行。 一旦出现某个模块被“循环加载”就只输出已经执行的部分,还没有执行的部分是不输出的 ES6模块是动态引用,如果使用import从一个模块加载变量,那些变量不会缓存,而是成为一个指向被加载模块的引用,impor/export最终都是编译为require/exports来执行的 15、谈谈对node.js npm webpack的理解 ebpack能够把.vue后缀名的文件打包成浏览器能够识别的js,而这个.vue文件装换需要打包器vue-loader; 这个vue-loader打包器是可以从npm上面下载,npm下载文件之后; webpack打包文件的时需要node环境去运行 16、使用npm有哪些好处? 通过NPM,你可以安装和管理项目的依赖,并且能够指明依赖项的具体版本号,可以通过package.json文件来管理项目信息,配置脚本 17、AMD CMD规范的区别 CommonJS和AMD都是JavaScript模块化规范 CMD依赖就近,而AMD依赖前置 CMD是延迟执行的,而AMD是提前执行的 AMD的API默认是一个当多个用,CMD的API严格区分,推崇职责单一 18、如何判断当前脚本运行在浏览器还是node环境中 通过判断 Global 对象是否为 window ,如果不为window ,当前脚本没有运行在浏览器中 19、简述同步和异步的区别,如何避免回调地狱 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为 异步方法调用一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。 而异步方法通常会在另外一个线程中,整个过程,不会阻碍调用者的工作 避免回调地狱:
1)Promise2)async/await3)generator4)事件发布/监听模式
20、几种常见模块化规范的简介 CommonJS规范主要用于服务端编程,加载模块是同步的,这并不适合在浏览器环境,因为同步意味着阻塞加载,浏览器资源是异步加载的 AMD规范在浏览器环境中异步加载模块,而且可以并行加载多个模块。 不过,AMD规范开发成本高,代码的阅读和书写比较困难 CMD规范与AMD规范很相似,都用于浏览器编程,依赖就近,延迟执行,可以很容易在Node.js中运行(依赖SPM 打包,模块的加载逻辑偏重) ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案 21、app.use和app.get区别 app.use(path,callback)中的callback既可以是router(路由)对象又可以是函数 app.get(path,callback)中的callback只能是函数 22、说一下事件循环eventloop  1)所有同步任务都在主线程上执行,形成一个执行栈 2)当主线程中的执行栈为空时,检查事件队列是否为空,如果为空,则继续检查; 如不为空,则执行3 3)取出任务队列的首部,加入执行栈 4)执行任务 5)检查执行栈,如果执行栈为空,则跳回第 2 步; 如不为空,则继续检查 23、node怎么跟MongoDB建立连接 1)引入mongoose 2)使用mongoose.connect()方法连接到MongoDB数据库 3)监听连接是否成功 4)然后通过node,书写接口,对数据库进行增删改查 24、node 和 前端项目怎么解决跨域的 通过在node服务器端设置
//解决跨域问题        app.use(async(ctx, next) => {                        //指定服务器端允许进行跨域资源访问的来源域。可以用通配符*表示允许任何域的JavaScript访问资源,但是在响应一个携带身份信息(Credential)的HTTP请求时,必需指定具体的域,不能用通配符            ctx.set("Access-Control-Allow-Origin", "*");            //可选。它的值是一个布尔值,表示是否允许客户端跨域请求时携带身份信息(Cookie或者HTTP认证信息)。默认情况下,Cookie不包括在CORS请求之中。当设置成允许请求携带cookie时,需要保证"Access-Control-Allow-Origin"是服务器有的域名,而不能是"*";如果没有设置这个值,浏览器会忽略此次响应。            ctx.set("Access-Control-Allow-Credentials", true);                        //指定服务器允许进行跨域资源访问的请求方法列表,一般用在响应预检请求上            ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");                        //必需。指定服务器允许进行跨域资源访问的请求头列表,一般用在响应预检请求上            ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type");            // ctx.set("X-Powered-By", ' 3.2.1');                        //告诉客户端返回数据的MIME的类型,这只是一个标识信息,并不是真正的数据文件的一部分            ctx.set("Content-Type", "application/json;charset=utf-8");                        //如果不设置mode,直接设置content-type为application/json,则fetch会默认这是跨域模式(mode:'cors'),在跨域POST之前,客户端会先发一条OPTIONS请求来”探探路”,如果服务器允许,再继续POST数据。对于这种OPTIONS请求,需要在服务器配置允许接受OPTIONS请求,这样写就是直接允许了所有的OPTIONS请求,也可以按照需求来判断OPTIONS请求中更详细的信息            if (ctx.request.method == "OPTIONS") {                ctx.response.status = 200            }            await next();        });
今天就分享这 么多, 关于Node常见面试题,你学会了多少 欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【 在看 】,让更多人看到该文章。 972cce2bbed443de9c6b9984f76c7ac8.gif

1fcd8d79efcd874a019beb78bf681316.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值