Node.js 作为一个灵活而健壮的运行时环境,在服务器端脚本、网络和实时应用程序开发方面表现出色,已经获得了极大的欢迎。虽然 Node 应用程序通常使用基于模块的路由,但可以实现基于文件的路由来提高工作效率、可扩展性等。
在开发有组织的 Web 应用程序时,路由有助于确保最终应用程序结构良好且井然有序。基于文件的路由通过将应用的路由映射到特定文件来实现此目的。这简化了路由并有助于代码组织,从而使维护应用程序变得更加容易。
在本文中,我们将探讨如何在 Node.js 应用程序中实现基于文件的路由。这将允许您编写结构良好且可维护的代码,这些代码可以随着项目的复杂性而扩展。
若要充分利用本文,需要基本了解如何使用 Node.js 构建 Web 应用。还需要在计算机上安装 Node.js 以及代码编辑器。
基于文件的路由
基于文件的路由系统是一种处理路由任务的方法,需要将应用程序路由点映射到特定文件。这将在文件结构和应用程序的 URL 结构之间建立直观的连接。
在基于文件的路由中,可以根据文件系统层次结构构建应用程序路由,从而更易于理解、更新和扩展它们。当想要修改路由时,可以轻松导航到相关文件。
随着我们深入研究该主题,我们将探讨基于文件的路由在 Node.js 应用程序中的优势和实际应用。
使用节点文件路由器实现基于文件的路由
流行的框架(如 Next.js)因其通过高效、内置、基于文件的路由功能有效地帮助简化 Web 应用程序开发而得到广泛认可。虽然这可能很方便,但这些框架也存在锁定的不利可能性。
如果你喜欢在纯 Node.js 或任何库中自由使用基于文件的路由,而不受特定框架的限制,该怎么办?这就是 Node File Router 的用武之地。
节点文件路由器提供了一种与技术无关的方法,用于将基于文件的路由合并到 Node.js 应用程序中。它与普通的 Node.js 和库(如 Express.js)无缝协作。
Node File Router 支持的一些功能包括:
- 动态路由:节点文件路由器可以有效地处理动态 URL,例如
/products/[productId]
将这些 URL 与适当的文件路径匹配并提取请求中包含的参数,例如[productId]
- CommonJS 和 ES 模块支持:与 CommonJS 和 ES 模块配合良好,使 Node File Router 非常适合每个 Node.js 项目
- TypeScript 支持:Node File Router 支持 TypeScript 编写类型安全的路由代码
- 支持其他协议:Node File Router 附带的自定义适配器允许使用 Node 运行 HTTP 和 WebSockets
- 与其他框架和技术的兼容性:节点文件路由器还与 Node.js Web 框架(如 Express 和 Bun 运行时)兼容
让我们深入探讨如何使用 Node File Router 在 Express 应用程序中设置基于文件的路由。
项目设置
我们需要为项目创建一个文件夹,设置 package.json 并将其初始化为 Node.js 项目。打开终端并输入以下命令:
mkdir file-router-demo
cd file-router-demo
npm init -y
接下来,我们需要安装 Node File Router 和其他将在项目中使用的包:
npm install node-file-router express nodemon
在项目的根目录下创建一个新 server.js
文件,该文件将用作应用程序的入口点。在此文件中,包括以下代码:
import express from "express";
const port = 4000;
const app = express();
app.listen(port, () => {
console.log(`Server running on <http://localhost>:${port}`);
});
在 package.json
文件中,更新 type
和 scripts
字段。这将提示应用程序分别使用 ES 模块和使用 Nodemon 启动 Express 服务器:
{
"type": "module",
"scripts": {
"dev": "nodemon ./server.js"
}
}
到目前为止,我们已经介绍了为基于文件的路由设置 Node.js 项目所需的内容。在下一节中,我们将配置 Node File Router 创建路由。
定义路由
在深入研究创建路由之前,我们需要配置 Node File Router 以使用我们的 Express应用程序。将 server.js
文件中的代码更新为以下内容:
import express from "express";
import { initFileRouter } from "node-file-router";
const port = 4000;
const app = express();
const fileRouter = await initFileRouter();
app.use(fileRouter);
app.listen(port, () => {
console.log(`Server running on <http://localhost>:${port}`);
});
为了启动节点文件路由器,利用该 initFileRouter()
函数将其声明为全局中间件,根据指定的路由文件处理传入请求。
默认情况下,系统会在 ./api
目录中搜索这些路由。但是,我们可以通过在 initFileRouter
函数中的 options
对象中包含属性 baseDir
来更改这一点。
创建一个在项目根目录下命名 api
的文件夹。在此文件夹中,创建一个名为 index.js
并添加以下代码的新文件:
export default {
get: (req, res, next, routeParams) => {
res.send("Hello world!");
},
};
此代码导出一个对象,该对象定义用于处理 GET 请求的路由。当向 /
路由发出请求时,服务器会发送响应消息 Hello world!
。如果我们需要处理使用其他 HTTP 方法发出的请求,我们可以轻松地将它们添加到带有相关处理函数中。
有了这个,我们已经成功地在 Node.js 中使用基于文件的路由创建了我们的第一个路由。在下一节中,我们将学习如何使用动态路由参数。
使用路由参数
大多数时候,我们构建的 Web 应用程序是动态的和数据驱动的。在这种情况下,无论我们使用什么路由机制,都应该支持使用动态路由参数。
要在节点文件路由器中使用动态参数,我们首先需要定义路由。一旦定义了我们的路由,我们就可以实现我们的路由处理程序。现在让我们看看如何做到这一点。
为路由创建目录结构,每个目录代表不同的路由段。可以按照如下所示的目录结构创建路由:
api/
├── products/
│ ├── [productId].js
├── index.js
表示 [productId]
动态参数。当用户访问路由时, [productId].js
将执行文件中定义的 /products/[productId]
路由处理程序。
现在我们已经定义了路由,我们可以实现路由处理程序了。查看路径 [productId].js
的文件应包含以下代码:
export default {
get: (req, res, next, routeParams) => {
const { productId } = routeParams;
if (!productId) {
res.end("Product id not specified");
}
fetch(`https://fakestoreapi.com/products/${productId}`)
.then((response) => response.json())
.then((json) => res.json(json));
},
};
当在浏览器中访问 http://localhost:4000/products/1
时,应该会看到类似于以下内容的响应:
显示的 JSON 响应包含命中 /products/1
, id
为 1
的产品的详细信息。它包括产品信息,例如其标题、价格、描述、类别、图像 URL 和评级。
Node.js 中基于文件的路由的优缺点
尽管基于文件的路由为 Node.js 项目提供了好处,但它也有一些缺点。以下是在 Node.js 中实现基于文件的路由的优点和缺点。
Node.js 中基于文件的路由的一些优点包括:
- 模块化:使用基于文件的路由使我们能够构建模块化代码库。每个路由的文件都定义了该路由,从而可以更轻松地查找、编辑和更新我们需要编辑的文件,而不会影响其他文件
- 可读性:模块化还提高了代码库的可读性和可维护性。单个文件隔离了路由或相关路由组,因此开发人员只需检查文件结构即可了解路由在应用程序中的工作方式
- 可伸缩性:基于文件的路由会随着应用程序大小的增加而清晰地扩展。由于永远不需要对现有代码进行重大更改来不断添加新的路由文件,因此管理代码库仍然高效且简单明了
同时,Node.js 中基于文件的路由的一些缺点包括:
- 复杂性:虽然基于文件的路由可以随着应用大小的增加而扩展,但特别大规模的应用程序的文件结构可能会变得越来越复杂且难以管理。此类目录可能包含许多路由文件,最终导致无法管理的目录布局
- 员工入职挑战:如果没有明确的命名和组织路由文件的标准和约定,加入项目团队的新开发人员可能不清楚项目的路由结构
- 不灵活:虽然基于文件的路由解决方案可能比传统的基于模块的路由更灵活,但它可能无法为极端动态或特定的路由需求提供足够的灵活性。在这种情况下,可能需要探索 Express.js、Fastify 和 Adonis.js 等库提供的替代路由解决方案
- 有限的路由功能:基于文件的路由解决方案可能不支持某些高级路由功能,例如路由命名、路由中间件和参数绑定
牢记这些潜在的缺点可以帮助您减轻它们对项目的影响,并确定基于文件的路由何时才是一个好的选择。
基于文件的路由与传统的基于模块的路由
一般来说,基于文件的路由适用于较小的项目。传统的基于模块的路由为更复杂的应用程序提供控制,这些应用程序需要非常专业的路由配置,有时还需要支持中间配置。
结论
Node.js 中基于文件的路由是一种强大的技术,可增强代码组织、可伸缩性和可维护性。通过采用这种方法,开发人员可以简化他们的项目、改善协作并简化 Web 应用程序中的路由。采用基于文件的路由使开发人员能够创建灵活且有弹性的 Node.js 应用程序,这些应用程序可以轻松适应不断变化的需求,最终为更强大、更愉快的开发体验铺平道路。
原文:blog.logrocket.com/using-node-…
原文链接:https://juejin.cn/post/7324151621298225187 作者:关山月