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