问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

饿了么团队对Node.js会问的面试题

发布网友 发布时间:2022-05-07 00:40

我来回答

2个回答

懂视网 时间:2022-04-22 17:49

本篇文章给大家带来的内容是关于Node.js的面试题内容总结(附答案),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

  • 原文: Node.js Interview Questions and Answers (2017 Edition)

  • 译者: Fundebug

  • 为了保证可读性,本文采用意译而非直译。

    问题

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

  • 如何避免回调地狱?

  • 什么是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(参考Async/Await替代Promise的6个理由)

  • 3. 什么是Promise?

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

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

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

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

  • ESLint

  • Standard

  • 感兴趣的话,可以参考JavaScript Clean Coding

    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. 什么是测试金字塔?举例说明

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

    325841298-58eb2c47c247b_articlex.png

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

  • 很多单元测试,分别测试各个模块(依赖需要stub)

  • 较少的集成测试,测试各个模块之间的交互(依赖不能stub)

  • 少量端到端测试,去调用真正地接口(依赖不能stub)

  • 7. 最喜欢哪个HTTP框架?为什么?

    这个问题标准答案。需要描述框架的优缺点,这样可以反映开发者对框架的熟悉程度。

    8. Cookies如何防范XSS攻击?

    XSS(Cross-Site Scripting,跨站脚本攻击)是指攻击者在返回的HTML中插入JavaScript脚本。为了减轻这些攻击,需要在HTTP头部配置set-cookie:

  • HttpOnly - 这个属性可以防止cross-site scripting,因为它会禁止Javascript脚本访问cookie。

  • secure - 这个属性告诉浏览器仅在请求为HTTPS时发送cookie。

  • 结果应该是这样的: Set-Cookie: sid=<cookie-value>; HttpOnly. 使用Express的话,cookie-session默认配置好了。

    9. 如何保证依赖的安全性?

    编写Node.js应用时,很可能依赖成百上千的模块。例如,使用了Express的话,会直接依赖27个模块。因此,手动检查所有依赖是不现实的。唯一的办法是对依赖进行自动化的安全检查,有这些工具可供选择:

  • npm outdated

  • Trace by RisingStack

  • NSP

  • GreenKeeper

  • Snyk

  • 附加题

    1. 这段代码有什么问题?

    new Promise((resolve, reject) =>
     {
     throw new Error('error')
     })
     .then(console.log)

    then之后没有catch。这样的话,错误会被忽略。可以这样解决问题:

    new Promise((resolve, reject) =>
     {
     throw new Error('error')
     })
     .then(console.log).catch(console.error)

    调试一个大型的项目时,可以使用监控unhandledRejection事件来捕获所有未处理的Promise错误:

    process.on('unhandledRejection', (err) =>
    {
     console.log(err)
    })
    2. 这段代码有什么问题?
    function checkApiKey(apiKeyFromDb, apiKeyReceived)
    {
     if (apiKeyFromDb === apiKeyReceived)
     {
     return true
     }
     return false
    }

    比较密码时,不能泄露任何信息,因此比较必须在固定时间完成。否则,可以使用timing attacks来攻击你的应用。为什么会这样呢?Node.js使用V8引擎,它会从性能角度优化代码。它会逐个比较字符串的字母,一旦发现不匹配时就停止比较。当攻击者的密码更准确时,比较的时间越长。因此,攻击者可以通过比较的时间长短来判断密码的正确性。使用cryptiles可以解决这个问题:

    function checkApiKey(apiKeyFromDb, apiKeyReceived)
    {
     return cryptiles.fixedTimeComparison(apiKeyFromDb, apiKeyReceived)
    }

    3. 这段代码的输出是什么?

    Promise.resolve(1) 
     .then((x) => x + 1)
     .then((x) => { throw new Error('My Error') })
     .catch(() => 1)
     .then((x) => x + 1)
     .then((x) => console.log(x))
     .catch(console.error)

    答案是2,逐行解释如下:

    1. 创建新的Promise,resolve值为1。

    2. x为1,加1之后返回2。

    3. x为2,但是没有用到。抛出一个错误。

    4. 捕获错误,但是没有处理。返回1。

    5. x为1,加1之后返回2。

    6. x为2,打印2。

    7. 不会执行,因为没有错误抛出。

    热心网友 时间:2022-04-22 14:57

    可能有安全相关的问题,你最好了解一下。建议你看一下这篇nodejs代码保护的:

    如何对NodeJS代码进行保护?

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    QQ空间代码不用了。怎么回原? 怎样才能把我的QQ空间变回原样啊~~~(我乱用代码的后果~555555~~) 小的的意思是什么 ...中,硫元素的化合价最高的是( )A.SO2B.H2SO4C.H2SD.Na2SO ...中硫元素化合价相同( )A.S、SO2B.SO2、H2SO4C.H2S、H2SO4D.SO3... 下列硫的单质和化合物中,硫元素的化合价是+4的是( )A.SB.SO2C.H2SD... 下列化合物中,硫元素的化合价为+4价的是( )A.H2SB.SO2C.SO3D.H2SO 下列化合物中,硫元素的化合价为+4价的是( )A.CaSO4B.H2SC.Na2SO3D... ...元素的化合价为+4价的是( )A.SO2B.H2SC.SO3D.H2SO 梦幻西游:三界功绩有什么用?原来有这么多用处 Node.js 的面试题是怎么样的 请问一下现在这个滨州龙王庙年的那个韭菜价格多少钱? 丰县的韭黄现在多少钱 跪求 大姐 大哥们 我们家种的韭菜有5000斤 请问现在郑州的韭菜价格批发多少钱一斤??? 韭黄一号与二点有什么区别? 现在韭黄卖多少钱一斤 韭菜黄卖多少钱一斤??? 韭黄多少一斤? 2019年现在韭黄多少钱一斤 韭黄什么价格? 一个人下班回家走在路上的说说 一个人下班回家走在路上的说说 下班回家路上孤独是怎样的体验? 下班回家路上孤独是怎样的体验? 我买了一个新手机,登录QQ密码帐号输了,显示要我输入验证码,但是我已换了手机号码怎么办呢? 我的工人下班回家在路上自己骑车摔伤,老板有无责任? 我的工人下班回家在路上自己骑车摔伤,老板有无责任? 在下班回家的路上受伤,责任应该由谁承担 在下班回家的路上受伤,责任应该由谁承担 你平时在下班回家的路上都是在做些什么? 初入nodejs,被一个题困惑了,求解答 关于nodejs问题。 nodejs问题求解 nodejs问题? nodejs的一个疑问,详见问题补充中的代码及说明,问题是为什么req被执行... 求助,新手学习nodejs搭后台,接口写法上的问题 关于nodejs 局部刷新问题 割双眼皮危害? 做双眼皮的害处是什么? 支付宝上面的一件代发平台可靠吗? 古南丰黄酒好喝吗? 积分不够怎么改换支付? qq游戏天空之剑开服的每日冲榜是啥? 腾讯天空之剑龙骑士属性点怎么加 qq游戏天空之剑天使精魄怎么合成使用的? QQ游戏天空之剑518服怎么找到? 天空之剑飞爪怎么获得 天空之剑怎么打不开了,出现这个问题,之前都没问题。说是应用程序出现问题,有图 天空之剑实名认证异常是什么原因导致的? 天空之剑天问答题称号能永久吗?