nodejs路由之代码分离

本文深入讲解NodeJS中路由的功能及实现方法,包括基本路由设置、路由参数使用、路由分离及Express Router的高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nodejs提供了路由功能,解决客户端各类请求对应的处理问题,相当于springboot开发各个controller对应的方法,nodejs提供的路由,也支持各种方法:get,post,delete等等,还支持路由参数比如/user/:id,对应的请求路径中携带了用户id。如下代码演示了如何使用nodejs的路由功能。如下代码,app.js,它实现了构建http服务和路由功能:

var express = require("express");
var app = express();
app.get("/",function(req,res){
    res.send("ok");
});
app.get("/hello",function(req,res){
    res.contentType("json");
    res.send(JSON.stringify({code:200,data:"success"}));
});
app.get("/user",function(req,res){
    var list = [];
    list.push({id:101,name:"xxx",age:20});
    list.push({id:102,name:"yyy",age:18});
    res.contentType("json");
    res.send(JSON.stringify(list));
});
app.get("/user/:id",function(req,res){
    var id = req.params.id;
    var list = [];
    list.push({id:101,name:"xxx",age:20});
    list.push({id:102,name:"yyy",age:18});
    res.contentType("json");
    res.send(JSON.stringify(list[id]));
});
app.listen(8000,function(){
    console.log("server running at http://127.0.0.1:8000/");
});

请求:/

请求:/hello

请求:/user

请求:/user/1

当我们的项目越来越大的时候,类似app.get,app.post等等的请求越来越多,路由代码都封装在一个app.js中,就显得很特别臃肿,而且不利于维护。我们考虑将router路由部分分离出来,单独形成一个文件。

我们利用nodejs提供的模块化思想,将路由部分剥离出来。这样原来的app.js就成了如下的样子。

var express = require("express");
var app = express();

app.listen(8000,function(){
    console.log("server running at http://127.0.0.1:8000/");
});

module.exports = app;
单独抽离出来的代码我们保存为router.js

var app = require("./app");
app.get("/",function(req,res){
    res.send("ok");
});
app.get("/hello",function(req,res){
    res.contentType("json");
    res.send(JSON.stringify({code:200,data:"success"}));
});
app.get("/user",function(req,res){
    var list = [];
    list.push({id:101,name:"xxx",age:20});
    list.push({id:102,name:"yyy",age:18});
    res.contentType("json");
    res.send(JSON.stringify(list));
});
app.get("/user/:id",function(req,res){
    var id = req.params.id;
    var list = [];
    list.push({id:101,name:"xxx",age:20});
    list.push({id:102,name:"yyy",age:18});
    res.contentType("json");
    res.send(JSON.stringify(list[id]));
});

这个时候,我们如果单独启动app.js,那么这部分是没有路由的,请求首页,我们会得到如下结果:

这个原因很好解释,因为app.js里面只是声明了一个模块app,并且启动了http服务,但是并没有包含路由信息,所以请求失败。我们如果想要达到前面的效果,我们需要启动router.js。 

这种分离方式导致了我们启动服务需要启动router.js,项目启动的入口发生了变化,我们只想让router.js只是提供一个路由功能,而不是项目启动入口。

我们可以考虑将路由封装成一个函数的形式,然后在app.js代码中,通过函数调用的方式,把路由功能加入到app模块中。

 router.js

app.js

这样,通过route函数将路由和app两个模块结合在了一起,同样能够达到前面的要求,而且入口在app.js文件。但是这还不是最好的解决方案。这种方案里面,我们在router.js文件里面其实通过route(app)相当于引用了app模块,然后在app.js里面又引用了route模块,耦合太重。我们希望路由是一个单独的模块,不需要与app模块依赖在一起。

Express提供了Router()函数,他提供了路由功能,可以单独提供路由功能,而不需要引用app模块。这里写上代码:

router.js

var express = require("express");
var router = express.Router();

router.get("/",function(req,res){
    res.send("ok");
});
router.get("/hello",function(req,res){
    res.contentType("json");
    res.send(JSON.stringify({code:200,data:"success"}));
});
router.get("/user",function(req,res){
    var list = [];
    list.push({id:101,name:"xxx",age:20});
    list.push({id:102,name:"yyy",age:18});
    res.contentType("json");
    res.send(JSON.stringify(list));
});
router.get("/user/:id",function(req,res){
    var id = req.params.id;
    var list = [];
    list.push({id:101,name:"xxx",age:20});
    list.push({id:102,name:"yyy",age:18});
    res.contentType("json");
    res.send(JSON.stringify(list[id]));
});

module.exports = router;

app.js

var express = require("express");
var app = express();
var router = require("./router");
app.use(router);
app.listen(8000,function(){
    console.log("server running at http://127.0.0.1:8000/");
});

这样,我们在app.js中,通过app.use(router)就将router模块成功的挂载到了app模块上,实现了路由挂载。而路由模块,则不用依赖app模块了,他真正实现了代码分离,模块之间弱耦合。

### Node.js 在前后分离架构中的应用 #### 背景概述 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 编写服务器应用程序。由于其异步 I/O 和事件驱动模型的特点,在构建高性能 Web 应用方面具有显著优势[^1]。 #### 前后分离的核心理念 前后分离是一种现代软件开发模式,其中前专注于用户体验和界面展示,而后则主要负责数据逻辑处理和服务支持。这种分离使得前可以独立于后进行迭代更新,同时也降低了两者的耦合度[^5]。 #### 使用 Express 框架搭建后服务 Express 是一个轻量级的 Node.js Web 开发框架,提供了丰富的功能来快速创建 RESTful API 接口。通过 Express 可以轻松定义路由、中间件以及错误处理器等功能模块。例如: ```javascript const express = require('express'); const app = express(); // 定义API接口 app.get('/api/products', (req, res) => { const products = [ { id: 1, name: 'Product A' }, { id: 2, name: 'Product B' } ]; res.json(products); }); // 启动监听 app.listen(3000, () => console.log('Server running on port 3000')); ``` 上述代码片段展示了如何利用 Express 创建一个简单的商品查询接口。 #### 数据交互方式 在前后分离架构下,通常采用 JSON 格式的 HTTP 请求作为双方的数据交换媒介。这种方式不仅便于解析也利于跨平台兼容性。此外还可以引入 WebSocket 技术实现实时通信需求[^2]。 #### 提升团队协作效率 当采用 Node.js 实施前后分离策略时,能够有效减少传统单体架构下的重复劳动并提高整体研发效能。特别是对于熟悉 JavaScript 的工程师而言,统一的语言体系有助于缩短上下文切换时间,进而促进生产力增长[^3]。 #### 面临挑战与解决办法 尽管如此,实施过程中也可能遇到诸如安全性保障不足等问题。对此可以通过加强身份验证机制(如 JWT)、合理设置 CORS 策略等方式予以应对[^4]。 ### 结论 综上所述,借助 Node.js 平台及其生态系统工具链,可高效完成现代化互联网产品的设计开发任务;同时遵循最佳实践原则,则能在保证质量的前提下加速交付周期。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值