1.1.2:node.JS 的路由控制
1. 运行原理
在 1.1.1 节中, 提到过 App.JS 中 App.get("/",routes.index) 可以用以下代码取代:
- App.get("/",function(req,res){
- res.render("index",{title:"Express"});
- })
这段代码可以这样理解: 当访问主页时, 调用 ejs 模板引擎来渲染 index.ejs 模板文件 (即将所有的 tittle 变量替换成字符串 Express), 生成静态页面并渲染在浏览器上.
我就在这里做一个修改, 既然以上的代码可以实现路由的功能, 那么我可以去除 routes/index.JS 文件, 把实现路由功能的代码都写在 App.JS 里, 随着功能需求的增多, App.JS 会变得臃肿且难以维护, 这不符合代码模块化的思想, 所以呢, 那些实现路由功能的代码都放在了 routes/index.JS 中. 官方给出的写法是在 App.JS 中实现了简单的路由分配, 然后再去 index.JS 中找到相应的路由函数, 最终实现路由功能. 我准备这样做, 把路由控制器和实现路由功能的函数都放到 index.JS 里, 在 App.JS 只有一个总的路由接口.
打开 App.JS, 做出修改和添加, 代码如下:
- /**
- * Module dependencies.
- */
- var express = require('express');
- var routes = require('./routes');
- /*
- var user = require('./routes/user');
- */
- var http = require('http');
- var path = require('path');
- var App = express();
- // all environments
- App.set('port', process.env.PORT || 3000);
- App.set('views', path.join(__dirname, 'views'));
- App.set('view engine', 'ejs');
- App.use(express.favicon());
- App.use(express.logger('dev'));
- App.use(express.JSON());
- App.use(express.urlencoded());
- App.use(express.methodOverride());
- App.use(App.router);
- App.use(express.static(path.join(__dirname, 'public')));
- // development only
- if ('development' == App.get('env')) {
- App.use(express.errorHandler());
- }
- /*
- App.get('/', routes.index);
- App.get('/users', user.list);
- */
- http.createServer(App).listen(App.get('port'), function(){
- console.log('Express server listening on port' + App.get('port'));
- });
- // 添加代码
- routes(App);
打开 index.JS, 修改如下
- /*
- * GET home page.
- */
- module.exports = function(App){
- App.get("/",function(req,res){
- res.render("index",{title:"Express"});
- });
- };
然后, 你再次在 App.JS 目录上, 打开终端, 输入 node App, 访问 localhost:3000, 你会发现修改后的效果和修改前的效果没有变化. 为何? 这里我在 routes/index.JS 中通过 module.express 导出了一个函数接口, 在 App.JS 中通过 require 加载了 index.JS, 然后通过 routes(App) 调用了 index.JS 导出的函数;
2. 路由规则
Express 封装了多种 http 请求方式, 常用的有 get 和 post, 即 App.get() 和 App.post();App.get() 和 App.post() 的第一个参数都为请求的路径, 第二个参数为处理请求的回调函数, 回调函数有两个参数, 请求和响应, 习惯用 req 和 res 表示. 路径请求及对应的获取路径有以下几种形式:
- (1)req.query
- //GET /murenziwei?like=node
- console.log(req.query.like) //=>"node"
- //GET /love?name=liwei&birthday[year]=2222&birthday[month]=11
- console.log(req.query.name);//=>"liwei"
- console.log(req.query.birthday.year);//=>"2222"
- console.log(req.query.birthday.month);//=>"11"
- (2) req.body
- //POST book[name]= 凡人修仙传 & book[author]= 忘语
- console.log(req.body.book.name)//=> 凡人修仙传
- console.log(req.body.book.author);//=> 忘语
- //POST {
- "name":"诛仙"
- }
- console.log(req.body.name);//=> 诛仙
- (3)req.params
- //GET /user/murenziwei
- console.log(req.params.name)//=>"murenziwei"
- //GET /language/typescript/node.JS
- console.log(req.params[0]);//=>"typescript/node.js"
- (4)req.param(xxx)
- //GET /language/typescript/node.JS?name=liwei
- console.log(req.param('name'))//=>"liwei"
- //POST name=liwei
- console.log(req.param('name'));//=>"liwei"
- // /user/liwei for /user/:name
- console.log(req.param('name'));//=>"liwei"
由上述的代码, 总结出以下获取路径的含义:
req.query: 处理 get 请求, 获取 get 请求体
req.body: 处理 post 请求, 获取 post 请求体
req.params: 处理 /:xxx 形式的 get 或 post 请求, 获取请求参数
req.param(): 处理 get 和 post 请求, 但查找优先级由高到低为: req.params=>req.body=>req.query
听说路径规则还支持正则表达式, 如果你感兴趣的话, 不妨一试.
3. 路由规则
在浏览器上访问 localhost:3000, 会显示如下图
如果我要访问 localhost:3000/hello 这种不存在的页面时就会显示如下图
这是因为不存在 / hello 的路由规则, 而且它也不是一个 public 目录下的文件, 所有 express 返回了 404Not Found 的错误. 下面我来添加一个路由规则, 使得当访问 localhost:3000/hello 时, 页面显示 "你好, 路由规则!"
修改 index.JS, 在 App.get("/") 后面添加一条路由规则
- /*
- * GET home page.
- */
- module.exports = function(App){
- App.get("/",function(req,res){
- res.render("index",{title:"Express"});
- });
- App.get("/hello",function(req,res){
- res.send("你好, 路由规则!");
- });
- };
修改后, 再来在终端重新输入 node App, 打开浏览器访问 local host:3000/hello 页面显示图下
看到这, 是不是很简单! 那么总结一下, 我主要讲了基本的路由规则以及如何添加一条路由规则的知识点.
来源: https://www.cnblogs.com/murenziwei/p/10153477.html