Node.js 面试题

346 阅读9分钟

Node.js

如何理解restfulAPI?

restfulAPI规范就是使用URL去定位服务器资源,使用http不同的方法,描述不同的操作(get,post,put,patch,deleta),对应增删查改及局部修改;还有一些细节上的规范比如:

  • 应该使用HTTPS协议,域名使用api专用域名
  • 返回值,增删查改,对应了不同的返回结果
  • API路径,推荐使用名词,并且推荐负数形式
  • http状态码的使用
    • 200:成功
    • 204:用户删除数据成功
    • 404:资源找不到
    • 401:未授权
    • 422:参数验证错误
    • 500:服务器内部错误

简述node.js事件循环

在node.js中,主要有同步和异步任务,事件循环,主要就是控制异步任务,形成一个事件循环队列,在一次事件循环队列中,会分为宏任务和微任务,宏任务主要包括:定时器,I/O操作(文件读写,http请求,数据库操作),微任务主要包括:promise,process.nextTick;在一次循环中,会优先执行微任务,在执行宏任务,如此循环执行这个事件队列,就叫事件循环

Node.js里面的全局对象有哪些?

  • global:此对象中的属性,是全局变量,可用于定义全局变量
  • __dirname:当前文件所在目录的绝对路径
  • __filename:当前文件所在的绝对路径
  • console:用于打印日志
  • process:node.js进程状态对象,提供了一个与操作系统的简单接口
  • Buffer:用于处理二进制数据的类
  • settimeout,clearTimeout:延迟执行
  • setInterval,clearInterval:重复执行
  • setImmediate,clearImmediate:用于在当前事件循环结束时执行的回调函数
  • require:加载某个模块
  • exports:对外暴露模块内的方法和熟悉

CommonJs和Es6导入导出的区别

commonJs使用require引入,exports导出,是值得拷贝 es6使用import引入,export导出,是值是引用

怎么提高一个API接口的性能

  1. 使用负载均衡: 负载均衡可以将网络流量在多个服务器上进行分发,从而避免任何一个服务器过载。
  2. 缓存数据: 可以使用Redis或Memcached等工具来缓存数据。缓存可以大量减少数据库查询,因此能够显著提高性能。
  3. 减少数据库查询次数: 尽可能地减少数据库查询,可以通过优化查询语句、批量查询等方式实现。
  4. 使用Gzip压缩: 通过对HTTP响应进行压缩,可以减少传输的数据量,从而提高性能。
  5. 使用HTTP/2: 相比于HTTP/1.x,HTTP/2提供了更好的性能,比如头部压缩、服务端推送等。
  6. 利用静态文件服务: 对于静态资源(例如图片、CSS文件、JavaScript文件),可以通过CDN服务进行分发,减轻服务器负担。
  7. 代码优化: 优化你的JavaScript代码,例如避免冗余计算、使用异步函数等。
  8. 使用集群: 在Node.js中,可以使用cluster模块充分利用CPU的多核心性能。
  9. 限制并发连接数: 接口被大量请求时,可以设置并发连接数的限制,防止服务器过载。
  10. 避免阻塞操作: Node.js是单线程的,所以需要避免CPU密集型的任务,尽可能让所有操作都非阻塞。
  11. 数据库索引: 如果API需要频繁查询数据库,那么合理的索引策略将大大加快查询速度。

WebSocket

  1. 什么是WebSocket?

WebSocket 是一个网络通信协议,可以在单个 TCP 连接上进行全双工通讯。这意味着服务器和客户端都可以向彼此发送数据,而不需要建立多个 TCP 连接。

  1. 为什么我们需要使用 WebSocket 而不是 HTTP?

虽然 HTTP 在大部分应用中都能很好的工作,它在处理实时数据交换方面有一些限制。HTTP 协议是无状态的,请求/响应模式,不支持双向通信。相反,WebSocket 是一个全双工协议,允许服务器主动向客户端发送数据,适合于实时交互应用。

  1. 在 Node.js 中如何使用 WebSocket?

在 Node.js 中,可以使用 ws 库来创建 WebSocket 服务器或客户端。安装 ws 库之后,你只需要引入库,创建一个 WebSocket 服务器或客户端,并定义消息处理函数就可以了。

  1. 解释下 Node.js 的 Event Loop 和它与 WebSocket 的关系?

Event Loop 是 Node.js 非阻塞 I/O 操作背后的秘密武器,它允许 Node.js 在等待非阻塞 I/O 操作完成时处理其他任务。WebSocket 使用 Event Loop 处理数据包,当有新的消息到达时,会触发 "message" 事件,相应的回调函数被立即执行。

  1. 如何在 WebSocket 连接关闭时清理资源?

WebSocket 连接关闭时,将触发 'close' 事件。你可以在 'close' 事件的回调函数中执行需要的清理操作。

  1. 请解释一下 WebSocket 握手过程?

WebSocket 描手过程开始于客户端发送一个标准的 HTTP 请求,这个请求头部包含一个 "Upgrade: websocket" 和 "Connection: Upgrade",告诉服务器想要建立一个 WebSocket 连接。如果服务器支持 WebSocket,那么它将返回一个状态码 101 Switching Protocols 的响应,表示同意切换到 WebSocket 协议。

  1. 什么情况下应该选择使用 WebSocket 而不是 RESTful API?

当你需要实时交互、需要服务器主动推送信息、或者大量小的请求/响应对导致 HTTP 开销时,应该选择使用 WebSocket。

  1. 在 WebSocket 连接中如何处理错误?

处理 WebSocket 错误主要涉及监听 error 事件。当 WebSocket 遇到错误时,将会触发该事件。你可以编写一个回调函数来处理它,例如记录错误、关闭连接或者通知用户。

  1. 如何保障 WebSocket 连接的安全性?

WebSocket 支持 wss(WebSocket Secure)协议,它类似于 HTTPS,可以提供安全的、加密的、基于 SSL/TLS 的 WebSocket 连接。你也可以使用同源策略来防止跨站请求伪造攻击。

  1. 在Node.js中如何广播WebSocket消息?

通过遍历已经连接的所有WebSocket客户端,然后对每一个客户端发送消息,就可以实现广播功能。

Express.js

  1. 什么是 Express.js?

    Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架。它为构建单页、多页及混合 web 应用提供了一系列强大的特性。

  2. Express.js 与 Node.js 有什么区别?

    Node.js 是一个可以在服务器端运行 JavaScript 的平台,而 Express.js 是基于 Node.js 的一个框架,帮助我们更容易地创建 web 应用。

  3. 在 Express.js 中,中间件(middleware)是什么,它有什么作用?

    在 Express.js 中,中间件指的是一个函数,它可以访问请求对象、响应对象以及应用的请求-响应周期中的下一个中间件。中间件可以执行诸如验证、路由、错误处理等操作。

  4. 如何在 Express.js 中设置路由?

    在 Express.js 中,可以通过调用 app.get()app.post()app.put()app.delete() 等方法来设置路由。每个方法都接收路径和回调函数作为参数。

  5. 在 Express.js 中,如何发送 JSON 响应?

    可以使用 res.json() 方法发送 JSON 响应。这个方法接受一个对象或数组作为参数,并将其转换为 JSON 格式发送给客户端。

  6. 如何在 Express.js 中使用模板引擎?

    Express.js 支持多种模板引擎,如 Jade(Pug) 和 EJS。通过 app.set('view engine', 'ejs') 可以设置使用的模板引擎。然后,可以使用 res.render() 方法渲染视图。

  7. 如何处理错误在 Express.js 中?

    Express.js 提供了一个特殊的错误处理中间件。这个中间件的函数参数有 4 个(err, req, res, next)。在该函数内部,可以对错误进行处理,例如,返回错误信息给客户端。

  8. 在 Express.js 中,app.use() 方法的作用是什么?

    app.use() 方法用于装载中间件函数。这个方法接受一个或多个函数作为参数,这些函数会按照顺序被调用。

  9. 怎样在 Express.js 中处理跨域问题(CORS)?

    在 Express.js 中,可以使用 cors 中间件处理跨域问题。只需要安装 cors 包并将其添加为全局中间件即可。

  10. 如何在 Express.js 中上传文件?

    在 Express.js 中,可以使用 multer 中间件处理文件上传。multer 可以解析 multipart/form-data 类型的请求,并将文件保存到磁盘。

koa.js

  1. 请介绍一下 Koa.js 和它的主要特性。 Koa.js 是一个新的 web 框架,由 Express 原班人马打造,致力于成为 web 应用和 API 开发领域中更强大、更灵活的工具。Koa.js 的主要特点包括:基于 middleware(中间件)的结构以增加灵活性,使用 generators 来避免回调地狱,以及错误处理能力。
  2. 谈谈 Koa.js 中间件的概念? 在 Koa.js 中,所有的请求处理都通过一系列的中间件组成的链条进行。一个中间件做完自己的事情后,可以决定是否将控制权交给链条上的下一个中间件。
  3. Koa.js 如何处理错误? Koa.js 提供了一种集中式错误处理机制,让你能捕获并处理程序在运行过程中出现的所有错误。默认情况下,Koa 会监听 error 事件并输出错误信息至 stderr。
  4. 如何在 Koa.js 里实现路由功能? Koa.js 本身并不包含路由库。但用户可以使用 koa-router 这样的第三方库来添加路由功能。这个库提供了类似 Express 框架的路由定义方式。
  5. 怎么理解 Koa 的 context(上下文)对象? 上下文 Context 在 Koa.js 中是一个非常重要的对象,它封装了原生的 HTTP 请求和响应对象,并且还提供了很多实用的方法和属性。
  6. 能否解释一下 Koa.js 和 Express.js 的区别? Koa.js 和 Express.js 都是用于创建 web 应用的 Node.js 框架。不过,Koa.js 更轻量级,而且引入了更现代的 JavaScript 特性,例如 Generator 和 async/await。此外,Koa.js 的中间件模型是有序流水线式的,使得请求处理过程更容易控制。
  7. 在使用 Koa.js 时, 如何发送 HTTP 响应? 我们可以直接使用 Context 对象的 body 属性来发送 HTTP 响应。比如 ctx.body = 'Hello World'; 就会发送一个包含 "Hello World" 字符串的响应。
  8. 如何在 Koa 中使用 cookies? Koa 的 Context 对象提供了操作 cookies 的方法。例如,ctx.cookies.set(name, value, [options]) 可用于设置 cookie,而 ctx.cookies.get(name, [options]) 可用于获取 cookie。
  9. 如何在 Koa.js 中处理文件上传? Koa.js 没有内置的文件上传处理功能,但我们可以借助于 koa-body、koa-multer 等中间件来处理文件上传。
  10. 如何在 Koa 应用中实现身份验证? Koa.js 没有内置的身份验证功能,但我们可以使用 passport.js 或者 koa-jwt 等中间件实现身份验证。