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页面显示图下

看到这,是不是很简单!那么总结一下,我主要讲了基本的路由规则以及如何添加一条路由规则的知识点。

初步掌握node的路由控制的更多相关文章

  1. node——路由控制

    路由控制 前面我接触了如何使用express建立一个工程,虽然这个工程包含了一些基本的框架,但是没有实际内容,我们会不断给他增加的. 工作原理 我们在浏览器中访问app.js建立的服务器时,会出现一个 ...

  2. 初步认识Node 之Express

    通过本文,你会对Express有一个较为具体的了解.    起源 2009年6月26日,TJ Holowaychuk提交了Express的第一次commit,接下来在2010年1月2日,有660次co ...

  3. 【nodejs笔记3】Express基本用法,和路由控制,和模板渲染ejs

    1. 路由控制的工作原理 //routes/index.js中的代码//访问主页时,调用ejs模板引擎,渲染index.ejs模板文件,生成静态页面,并显示在浏览器中.router.get('/', ...

  4. angularJs模块ui-router之路由控制

    在你的应用中大多数状态都有与其相关联的 url,路由控制不是设计完成 state 之后的事后想法,而是开始开发时就应该考虑的问题. 这里是如何设置一个基本url. $stateProvider .st ...

  5. Router和History (路由控制)-backbone

    Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...

  6. golang自定义路由控制实现(二)-流式注册接口以及支持RESTFUL

        先简单回顾一下在上一篇的文章中,上一篇我主要是结合了数组和Map完成路由映射,数组的大小为8,下标为0的代表Get方法,以此类推,而数组的值则是Map,键为URL,值则是我们编写对应的接口.但 ...

  7. rest_framework之解析器、路由控制、分页

    解析器 我们都知道,网络传输数据只能传输字符串格式的,如果是列表.字典等数据类型,需要转换之后才能使用 但是我们之前的rest_framework例子都没有转换就直接可以使用了,这是因为rest_fr ...

  8. Django-restframework之路由控制、解析器及响应器

    django-restframework之路由控制.解析器及响应器 一 前言 本篇博客介绍 restframework 框架的剩下几个组件,路由控制有三种:传统路由.半自动路由及全自动路由:解析器是用 ...

  9. web应用/路由控制/视图函数/单表多表操作

    一. 1.wen应用:BS架构的应用程序,B是浏览器,S:server(实现了wsgi协议)+ application https://www.cnblogs.com/liuqingzheng/art ...

随机推荐

  1. 多线程安全单例模式学习代码 c++11

    // Singleton.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <mutex> #include & ...

  2. Html5学习笔记:图片上传

    图片上传是业务需求中常见的功能,最基础的是单图片的上传.比较复杂的多图片上传,都是基于单图片上传. Form表单上传 h5的原生表单上传图片,代码如下: <!DOCTYPE html> & ...

  3. 1-JRE与JDK等知识

  4. 2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)

    传送门 题意:动态插入点,维护凸包面积. 思路:用setsetset维护极角序来支持面积查询即可. 然后注意选原点的时候要从初始三个点随机平均系数来避免精度误差. 代码: #include<bi ...

  5. Android 各种常见activity

    引用:Activity初学乍练 //1.拨打电话 // 给移动客服10086拨打电话 Uri uri = Uri.parse("tel:10086"); Intent intent ...

  6. 阅读笔记4 我是一只IT小小鸟

    经过一周连续三四天八小时以上坐在电脑前敲代码的“折磨”,去看看其他经受这些折磨的人的感受.这次读书笔记变成了逗比风,因为前几周认认真真记下书里写的重点内容,然后把学习的内容认真的记录下来的笔记被老师助 ...

  7. hiho 第七周 完全背包

    完全背包 #include<iostream> #include<memory.h> #include<cmath> using namespace std; #d ...

  8. java基础要点总结

    无意间看到youtube上的一组java基础的视频,顺便做了笔记,整理如下: 出处: 作者:Edward Shi 视频链接:https://www.youtube.com/watch?v=IQE9jH ...

  9. Windows 系统 IP 和端口的相关检测命令

    查看本机IP地址 查看自己电脑的ip,使用 ipconfig 命令 ipconfig 检测指定IP是否联通 检测某个ip是否可以连通,直接使用 ping 命令 ping 219.148.111.212 ...

  10. Android开发工程师文集-相关控件的讲解,五大布局

    前言 大家好,给大家带来Android开发工程师文集-相关控件的讲解,五大布局的概述,希望你们喜欢 TextView控件 TextView控件有哪些属性: android:id->控件的id a ...