0

0

Node.js的面试题内容总结(附答案)

不言

不言

发布时间:2018-10-25 14:19:56

|

4624人浏览过

|

来源于segmentfault

转载

本篇文章给大家带来的内容是关于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. 什么是测试金字塔?举例说明

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

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载

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=; 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. 不会执行,因为没有错误抛出。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 13.2万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号