初步掌握node的路由控制

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

时间: 2024-11-09 03:08:27

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

关于前后端分离后的路由控制问题

路由控制在多数框架中均有专门的方法,比如ng和node.但是只会使用是不可以的,虽然我连使用都不会.研究它的实现方式,才是正经道路,因为无论框架中的方式都炫酷或者实用,都是从底层开发出来了,那么底层的方法,就是需要了解研究的方法.依此,在以后的使用或者是自定义的时候才能够如臂使指. 那么前端的路由控制总归来说是有两种方法的. 第一种是H5新增的一类API,history.首先来看一下它的诸多方法. //与浏览器后退按钮作用相同 window.history.back(); //跳转到 windo

初步认识Node 之Express

通过本文,你会对Express有一个较为具体的了解. 起源 2009年6月26日,TJ Holowaychuk提交了Express的第一次commit,接下来在2010年1月2日,有660次commits的Express 0.0.1版本正式发布.TJ和Ciaron Jessup是当时最主要的两个代码贡献者.截止到目前为止,Express拥有了5016次commit,版本号为4.11.1,由strongloop维护. 定义 Express是一个简洁而灵活的node.js web 应用框架,它提供一

[Lab4] 路由控制

[Lab4] 路由控制 工具1: Distribute List 过滤路由 试验拓扑 试验目的: R1 过滤掉R3的环回口3.3.3.3 1-1 DL Use For RIP R1/R2/R3跑 RIP 配置省略 R1的回环口1.1.1.1可以ping通R3的回环口3.3.3.3 目标在R1 上过滤掉3.3.3.3路由 我们在R2 上作distribute list R2(config)#access-list 10 deny 3.3.3.0 0.0.0.255 R2(config)#acces

angularJs模块ui-router之路由控制

原文地址:http://bubkoo.com/2014/01/02/angular/ui-router/guide/url-routing/ 在你的应用中大多数状态都有与其相关联的 url,路由控制不是设计完成 state 之后的事后想法,而是开始开发时就应该考虑的问题. 这里是如何设置一个基本url. $stateProvider .state('contacts', { url: "/contacts", templateUrl: 'contacts.html' }) 当我们访问i

【我的笔记BLOG3】Express基本用法,和路由控制,和模板渲染ejs

1. 路由控制的工作原理 //routes/index.js中的代码//访问主页时,调用ejs模板引擎,渲染index.ejs模板文件,生成静态页面,并显示在浏览器中.router.get('/', function(req, res) { //捕获访问主页的GET请求 res.render('index', { title: 'Express' }); }); 官方给出的写法是在 app.js 中实现了简单的路由分配,然后再去 index.js 中找到对应的路由函数,最终实现路由功能. 我们不

Node.js 路由

Node.js 路由 我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码. 因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数.这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)确实值得探讨,但这里暂定其为我们的HTTP服务器的功能. 我们需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递.但是为了解析这些数据,我们需要额外的Node.JS模块,它们分别是

CodeIngiter 路由控制、路由自定义和 基于SEO的url重写等

配置项 application/config/routes 就是说的这里!   路由控制 让你的页面按照你希望的url方式去访问   路由自定义 帮助你实现路由的寻址,也就是key($var) =>value($url) 意义就是在向服务器发出请求之前的一步,你还可以再这里改变他寻址路径,也就是url形式   基于SEO的url重写 但是以上并不能满足实际的开发需求. 比如,我的旧页面的url不能变,那么我们首先就必须把controllers里的class和fun都改名,再在routes里自定义

[转]express 路由控制--next

next() express的路由控制有个next()功能,在定义了多个路由的时候,对匹配的url会按顺序执行, 例如,有这样两个路由,第一个路由会对满足“/”的地址,在req中添加一个user的属性,然后再交给接下去的路由处理 所以当访问....../user时,可以从req中取出user信息 [javascript] view plain copy app.get(/^\/*/,function(req, res, next){ req.user ="shuilan"; next(

Router和History (路由控制)-backbone

Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文中称Action). 当我们开发一个单页应用时,常常会遇到这样两个问题: 我们在同一个页面中通过用户的操作来隐藏.显示HTML块,为用户提供一个无刷新.完整流畅的体验,但用户可能并不知道他当前正处于同一个页面中,因此他希望通过浏览器的“前进”和“后退”按钮来返回和前进到上一步操作.当他真正这样操作时