板块导航

浏览  : 434
回复  : 7

[Nodejs] Node.js几道面试题

[复制链接]
cat77的头像 楼主
发表于 2017-1-11 15:24:20 | 显示全部楼层 |阅读模式
  一些声明 

  通过这些问题就来判断一个人的Node.js水平是不太严谨的,但是 它能让你对面试者在Node.js上的经验如何有个大概的了解。

  但是显然,这些问题并不会告诉你面试者思考问题的方式。

  Show me the code. 结合一些编程题来考察面试者吧

  大家都是人,不要做一个死板不近人情的面试官哦。

  什么是error-first的回调方式

  Error-first回调方式用来同时传递error和data。将错误作为第一个参数,它就必须先检查看看有没有错误先。另外的参数就用来传递data了。
  1. fs.readFile(filePath, function(err, data) {
  2.   if(err) {
  3.     //处理错误,这里的return很重要,如果发生错误,在此处就会停止了。
  4.     return console.log(err);
  5.   }
  6.   //传递data
  7.   console.log(data);
  8. })
复制代码

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

  模块化把回调函数分割成独立的函数

  使用 控制流的库 ,比如 async

  generators结合Promise

  async/await

  Promise是什么?

  概念不多说了,简单来说就是帮助你更好地处理异步操作的东西。
  1. new Promise((resolve, reject) => {
  2.   setTimeout(() => {
  3.     resolve('result');
  4.   }, 100)
  5. })
  6.   .then(console.log)
  7.   .catch(console.error)
复制代码

  stub是什么? 举个例子?

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

  例子是写文件,但实际上并没有这么做
  1. var fs = require('fs');

  2. var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb) {
  3.   return cb(null)
  4. })

  5. expect(writeFileStub).to.be.called
  6. writeFileStub.restore();
复制代码

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

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

  HttpOnly-这个属性用来防止跨站脚本攻击,它不允许cookie被JavaScript代码获取。

  secure-这个属性告诉浏览器只有在HTTPS连接时才发送cookie

  像这样: Set-Cookit: sid=<cookit-value>; HttpOnly

  下面这段代码有什么问题
  1. new Promise((resolve, reject) => {
  2.   throw new Error('error')
  3. }).then(console.log)
复制代码

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

  修改后:
  1. new Promise((resolve, reject) => {
  2.   throw new Error('error')
  3. }).then(console.log).catch(console.error)
复制代码

  如果你正在调试一个大型项目,你不知道哪个Promise可能会有问题,可以使用 unhandledRejection 。它会打印出所有未经处理的Promise异常
  1. process.on('unhandledRejection', (err) => {
  2.   console.log(err)
  3. })
复制代码

  下面的代码有什么问题?
  1. function checkAPIKey(apiKeyFromDb, apiKeyReceived) {
  2.   if (apiKeyFromDb === apiKeyReceived) {
  3.     return true
  4.   }
  5.   return false
  6. }
复制代码

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

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

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

  你可以使用 cryptiles 这个npm模块来解决这个问题
  1. function checkApiKey(apiKeyFromDb, apiKeyReceived) {
  2.   return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived)
  3. }
复制代码

  某乎上有个解释地挺好的 如何通俗地解释时序攻击(timing attack)?

  下面的代码会输出什么
  1. Promise.reso(1)
  2.   .then((x) => x + 1)
  3.   .then((x) => {throw new Error('My Error')})
  4.   .catch(() => 1)
  5.   .then((x) => x + 1)
  6.   .then((x) => console.log(x))
  7.   .catch(console.error)
复制代码

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

相关帖子

发表于 2017-1-11 15:24:49 | 显示全部楼层
LZ敢整点更有创意的不?兄弟们等着围观捏~
使用道具 举报

回复

发表于 2017-1-11 15:24:49 | 显示全部楼层
LZ敢整点更有创意的不?兄弟们等着围观捏~
使用道具 举报

回复

发表于 2017-1-11 15:24:49 来自手机 | 显示全部楼层
有空一起交流一下
使用道具 举报

回复

发表于 2017-1-11 15:24:50 | 显示全部楼层
个人觉得js是一种解释性语言,它提供了一个非常方便的开发过程,不需要编译,js与HTML标识结合在一起,从而方便用户的使用操作。
使用道具 举报

回复

发表于 2017-1-11 22:13:57 | 显示全部楼层
学习
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-62432495
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部