可在 API 中使用的 Express 认可的中间件
AWS 安全直播!
本文最初发表于coreycleary.me。这是我内容博客的转载文章。我每隔一两周会发布新内容,如果您想直接在邮箱中接收我的文章,可以订阅我的电子报!我还会定期发送速查表和其他免费资源。
当你开始一个 Express 项目时,弄清楚你需要哪些模块可能会让人感到困惑……
中间件也是如此。
更糟糕的是,Express 出厂时“不含电池”。
Express本身并没有太多预设方案。它只提供基础功能,剩下的部分需要你自己慢慢拼凑起来。
另一方面,Express提供的这种自由可以被视为其优势之一。
但是,当你只想开始构建功能,而不是浪费时间去弄清楚设置项目需要包含哪些中间件时,你会感觉自己像是在原地打转。
你可能会想——“我是否遵循了最佳实践?”
好消息是,有一些很棒的资源可以为你提供一些指导。其中一个经常被忽视的资源是Express 认可的中间件列表。
无需在论坛上询问模块推荐或浏览 10 个不同的教程来拼凑模块列表,这是 Express 团队自己提供的“预先审核”列表。
文档中列出了很多模块,所以不可能全部介绍,但我会谈谈我在大多数 Express REST API 中使用的一些模块,以及你可能需要在项目中使用它们的时机。
正文解析器
提取传入请求的整个请求体部分,并将其暴露在 `req.body` 中。简而言之,你需要它来处理/读取发送到 REST API 的 POST 请求体。
更新于 2020 年 3 月 2 日:如果您使用的是 Express 4.16.0 或更高版本,则无需再单独安装 body-parser 模块。Express 团队已将其重新集成到 Express 中。在设置中间件时,您只需执行 `exports.append app.use(express.json())()`,并且(如果您想要解析带有 URL 编码有效负载的传入请求)app.use(express.urlencoded({ extended: true }))紧接着执行 `exports.append()`。
cookie会话
用于将会话数据存储在客户端的 cookie 中(而不是将会话数据存储在服务器上,并在客户端 cookie 中引用会话 ID)。
如果我只是存储一些简单的信息,比如用户名,除此之外不存储其他内容,那么我会使用这个模块(而不是服务器端的“会话”模块),并将这些信息保存在客户端的 cookie 中。但通常情况下,我需要处理更敏感或更复杂的信息,因此我更倾向于使用服务器端的会话模块。
*有关何时使用“session”模块与“cookie-session”模块的更多指导,请参阅下面的注释。
科尔斯
根据我的经验,不使用 CORS 很难避免问题。如果您有多个不同的网站会向您的服务器发出 HTTP 请求,或者多个服务器使用相同的主机名但不同的端口(例如,从http://localhost:3000到http://localhost:4000),则需要启用 CORS。
这篇文章更详细地介绍了 CORS 以及需要启用它的场景。
好消息是,您不必为所有设备启用 CORS。您可以向 CORS Express 模块传递选项并使用白名单,如本文所述。
摩根
您可能已经设置了错误日志记录之类的功能,但此功能将记录整个 HTTP 请求。
如果您想知道这有什么用,不妨想想这种情况:您可能遇到过另一个服务与您的 Node 服务通信,但由于某种原因一直失败(例如出现 400 BAD REQUEST 错误)。记录请求可以让您看到实际发送到您服务的内容——这对于故障排除至关重要。
请务必屏蔽所有个人身份信息,例如社会安全号码。
穆尔特
当您的请求包含“multipart/form-data”Content-Type 标头时,请使用此功能。
通俗地说——每当您需要启用从表单上传文件的功能时。
静态服务
如果您想公开提供一些内容,例如与服务器端代码紧密相关的示例文档,或者如果您正在开发一个示例项目并希望提供静态资源,那么这个工具非常适合您。
如果您想要一个更基本的静态文件服务设置,并且不想使用此模块,则可以使用 Express 内置的 express.static (更多信息请参见此处)。
但对于生产级应用,我更喜欢使用像 nginx 或 HAproxy 这样的反向代理来提供静态文件服务。你甚至可以更进一步,使用专用的 CDN(内容分发网络)来提供静态文件服务(CDN 的目的就是专注于提供静态资源)。
会议
允许您在浏览器中创建 cookie,仅引用唯一的会话 ID + 在服务器端设置会话数据。
该模块支持将会话数据存储在大量存储系统中。请点击此处查看兼容列表。
*有关何时使用“session”模块与“cookie-session”模块的更多指导,请参阅下面的注释。
**请参阅下文关于如何将其与 cookie-parser 模块一起使用的说明。
笔记
-
cookie-session与session – cookie-session 的 README.md 文件提供了关于何时使用 cookie-session 的良好指导:
-
cookie 会话不需要服务器端的任何数据库/资源,但会话数据总量不能超过浏览器的最大 cookie 大小。
-
cookie 会话可以简化某些负载均衡场景。
-
cookie-session 可用于存储“轻量级”会话,并包含一个标识符,用于查找数据库支持的辅助存储,以减少数据库查找次数。
但如上所述,我通常使用会话。
** cookie-parser – 如果您正在使用 session 中间件模块,则不需要此模块。
最后,关于压缩中间件模块需要说明一点: express 中间件页面将此模块列为 gzip 压缩的一个选项,但是——就像提供静态文件一样——我更喜欢在代理/网络层而不是应用程序层(使用 nginx 或 HAproxy)执行此操作。
如果你的网站流量很高,那么在反向代理层进行压缩几乎是必须的。
总结
Express 官方文档包含大量实用信息,尤其是在生产环境最佳实践等方面。如果你之前没看过,我强烈建议你去看看!它们经常被人忽略。
热爱 JavaScript,但仍然被架构方面的问题以及服务结构搞得晕头转向?我每隔一到两周就会发布一篇关于 JavaScript 和 Node 的文章,如果你想直接在邮箱里收到所有新文章,点击这里订阅我的邮件列表!
文章来源:https://dev.to/ccleary00/express-approved-middlewares-to-use-in-your-api-2j8l