nodejs路由之代码分离

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模块了,他真正实现了代码分离,模块之间弱耦合。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

luffy5459

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

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

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

打赏作者

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

抵扣说明:

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

余额充值