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接口的性能
- 使用负载均衡: 负载均衡可以将网络流量在多个服务器上进行分发,从而避免任何一个服务器过载。
- 缓存数据: 可以使用Redis或Memcached等工具来缓存数据。缓存可以大量减少数据库查询,因此能够显著提高性能。
- 减少数据库查询次数: 尽可能地减少数据库查询,可以通过优化查询语句、批量查询等方式实现。
- 使用Gzip压缩: 通过对HTTP响应进行压缩,可以减少传输的数据量,从而提高性能。
- 使用HTTP/2: 相比于HTTP/1.x,HTTP/2提供了更好的性能,比如头部压缩、服务端推送等。
- 利用静态文件服务: 对于静态资源(例如图片、CSS文件、JavaScript文件),可以通过CDN服务进行分发,减轻服务器负担。
- 代码优化: 优化你的JavaScript代码,例如避免冗余计算、使用异步函数等。
- 使用集群: 在Node.js中,可以使用cluster模块充分利用CPU的多核心性能。
- 限制并发连接数: 接口被大量请求时,可以设置并发连接数的限制,防止服务器过载。
- 避免阻塞操作: Node.js是单线程的,所以需要避免CPU密集型的任务,尽可能让所有操作都非阻塞。
- 数据库索引: 如果API需要频繁查询数据库,那么合理的索引策略将大大加快查询速度。
WebSocket
- 什么是WebSocket?
WebSocket 是一个网络通信协议,可以在单个 TCP 连接上进行全双工通讯。这意味着服务器和客户端都可以向彼此发送数据,而不需要建立多个 TCP 连接。
- 为什么我们需要使用 WebSocket 而不是 HTTP?
虽然 HTTP 在大部分应用中都能很好的工作,它在处理实时数据交换方面有一些限制。HTTP 协议是无状态的,请求/响应模式,不支持双向通信。相反,WebSocket 是一个全双工协议,允许服务器主动向客户端发送数据,适合于实时交互应用。
- 在 Node.js 中如何使用 WebSocket?
在 Node.js 中,可以使用 ws 库来创建 WebSocket 服务器或客户端。安装 ws 库之后,你只需要引入库,创建一个 WebSocket 服务器或客户端,并定义消息处理函数就可以了。
- 解释下 Node.js 的 Event Loop 和它与 WebSocket 的关系?
Event Loop 是 Node.js 非阻塞 I/O 操作背后的秘密武器,它允许 Node.js 在等待非阻塞 I/O 操作完成时处理其他任务。WebSocket 使用 Event Loop 处理数据包,当有新的消息到达时,会触发 "message" 事件,相应的回调函数被立即执行。
- 如何在 WebSocket 连接关闭时清理资源?
WebSocket 连接关闭时,将触发 'close' 事件。你可以在 'close' 事件的回调函数中执行需要的清理操作。
- 请解释一下 WebSocket 握手过程?
WebSocket 描手过程开始于客户端发送一个标准的 HTTP 请求,这个请求头部包含一个 "Upgrade: websocket" 和 "Connection: Upgrade",告诉服务器想要建立一个 WebSocket 连接。如果服务器支持 WebSocket,那么它将返回一个状态码 101 Switching Protocols 的响应,表示同意切换到 WebSocket 协议。
- 什么情况下应该选择使用 WebSocket 而不是 RESTful API?
当你需要实时交互、需要服务器主动推送信息、或者大量小的请求/响应对导致 HTTP 开销时,应该选择使用 WebSocket。
- 在 WebSocket 连接中如何处理错误?
处理 WebSocket 错误主要涉及监听 error 事件。当 WebSocket 遇到错误时,将会触发该事件。你可以编写一个回调函数来处理它,例如记录错误、关闭连接或者通知用户。
- 如何保障 WebSocket 连接的安全性?
WebSocket 支持 wss(WebSocket Secure)协议,它类似于 HTTPS,可以提供安全的、加密的、基于 SSL/TLS 的 WebSocket 连接。你也可以使用同源策略来防止跨站请求伪造攻击。
- 在Node.js中如何广播WebSocket消息?
通过遍历已经连接的所有WebSocket客户端,然后对每一个客户端发送消息,就可以实现广播功能。
Express.js
-
什么是 Express.js?
Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架。它为构建单页、多页及混合 web 应用提供了一系列强大的特性。
-
Express.js 与 Node.js 有什么区别?
Node.js 是一个可以在服务器端运行 JavaScript 的平台,而 Express.js 是基于 Node.js 的一个框架,帮助我们更容易地创建 web 应用。
-
在 Express.js 中,中间件(middleware)是什么,它有什么作用?
在 Express.js 中,中间件指的是一个函数,它可以访问请求对象、响应对象以及应用的请求-响应周期中的下一个中间件。中间件可以执行诸如验证、路由、错误处理等操作。
-
如何在 Express.js 中设置路由?
在 Express.js 中,可以通过调用
app.get()、app.post()、app.put()、app.delete()等方法来设置路由。每个方法都接收路径和回调函数作为参数。 -
在 Express.js 中,如何发送 JSON 响应?
可以使用
res.json()方法发送 JSON 响应。这个方法接受一个对象或数组作为参数,并将其转换为 JSON 格式发送给客户端。 -
如何在 Express.js 中使用模板引擎?
Express.js 支持多种模板引擎,如 Jade(Pug) 和 EJS。通过
app.set('view engine', 'ejs')可以设置使用的模板引擎。然后,可以使用res.render()方法渲染视图。 -
如何处理错误在 Express.js 中?
Express.js 提供了一个特殊的错误处理中间件。这个中间件的函数参数有 4 个(err, req, res, next)。在该函数内部,可以对错误进行处理,例如,返回错误信息给客户端。
-
在 Express.js 中,
app.use()方法的作用是什么?app.use()方法用于装载中间件函数。这个方法接受一个或多个函数作为参数,这些函数会按照顺序被调用。 -
怎样在 Express.js 中处理跨域问题(CORS)?
在 Express.js 中,可以使用 cors 中间件处理跨域问题。只需要安装 cors 包并将其添加为全局中间件即可。
-
如何在 Express.js 中上传文件?
在 Express.js 中,可以使用 multer 中间件处理文件上传。multer 可以解析 multipart/form-data 类型的请求,并将文件保存到磁盘。
koa.js
- 请介绍一下 Koa.js 和它的主要特性。 Koa.js 是一个新的 web 框架,由 Express 原班人马打造,致力于成为 web 应用和 API 开发领域中更强大、更灵活的工具。Koa.js 的主要特点包括:基于 middleware(中间件)的结构以增加灵活性,使用 generators 来避免回调地狱,以及错误处理能力。
- 谈谈 Koa.js 中间件的概念? 在 Koa.js 中,所有的请求处理都通过一系列的中间件组成的链条进行。一个中间件做完自己的事情后,可以决定是否将控制权交给链条上的下一个中间件。
- Koa.js 如何处理错误? Koa.js 提供了一种集中式错误处理机制,让你能捕获并处理程序在运行过程中出现的所有错误。默认情况下,Koa 会监听 error 事件并输出错误信息至 stderr。
- 如何在 Koa.js 里实现路由功能? Koa.js 本身并不包含路由库。但用户可以使用 koa-router 这样的第三方库来添加路由功能。这个库提供了类似 Express 框架的路由定义方式。
- 怎么理解 Koa 的 context(上下文)对象? 上下文 Context 在 Koa.js 中是一个非常重要的对象,它封装了原生的 HTTP 请求和响应对象,并且还提供了很多实用的方法和属性。
- 能否解释一下 Koa.js 和 Express.js 的区别? Koa.js 和 Express.js 都是用于创建 web 应用的 Node.js 框架。不过,Koa.js 更轻量级,而且引入了更现代的 JavaScript 特性,例如 Generator 和 async/await。此外,Koa.js 的中间件模型是有序流水线式的,使得请求处理过程更容易控制。
- 在使用 Koa.js 时, 如何发送 HTTP 响应? 我们可以直接使用 Context 对象的 body 属性来发送 HTTP 响应。比如
ctx.body = 'Hello World';就会发送一个包含 "Hello World" 字符串的响应。 - 如何在 Koa 中使用 cookies? Koa 的 Context 对象提供了操作 cookies 的方法。例如,
ctx.cookies.set(name, value, [options])可用于设置 cookie,而ctx.cookies.get(name, [options])可用于获取 cookie。 - 如何在 Koa.js 中处理文件上传? Koa.js 没有内置的文件上传处理功能,但我们可以借助于 koa-body、koa-multer 等中间件来处理文件上传。
- 如何在 Koa 应用中实现身份验证? Koa.js 没有内置的身份验证功能,但我们可以使用 passport.js 或者 koa-jwt 等中间件实现身份验证。