experss路由工作原理

router.get("/", function(req, res) {

  res.render("index", {"title":"express"});

});

这段代码的意思是当访问主页时,调用ejs模板引擎,来渲染index.ejs模板文件(即将title变量全部替换为字符串Express),生成静态页面并显示在浏览器中。

我们来做一些修改,以上代码实现了路由的功能,我们当然可以不要routes/index.js文件,把实现路由功能的代码放到app.js里,我们当然可以不要routes/index.js文件,把实现路由功能的代码都放在app.js里,但随着时间的推移app.js会变得臃肿难以维护,这也违背了代码模块化的思想,所以我们把实现路由功能的代码都放在routes/index.js里。官方给出的写法是在app.js中实现了简单的路由分配,然后再去index.js中找到对应的路由函数,最终实现路由功能。我们不妨把路由控制器和实现路由共鞥男的函数都放到index.js里,app.js中只有一个总的路由接口。

最终将app.js修改为

var express require("express");

var path = require("path");

var favicon = require("server-favicon");

var logger = require("morgan");

var cookieParser = require("cookie-parser");

var bodyParser = require("body-parser");

var routes = require("./routes/index");

var app = express();

app.set("port", process.env.PORT || 3000);

app.set("view", path.join(_dirname, "views"));

app.set("view engine", "ejs");

//app.use(favicon(__dirname + "/public/favicon.ico"));

app.use(logger("dev"));

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({extended:true}));

app.use(cookieParser());

app.use(express.static(path.join(__dirname, "public")));

routes(app);

app.listen(app.get("port"), function() {

  console.log("Express server listening on port" + app.get("port"));

});

修改index.js如下:

module.exports = function(app) {

  app.get("/", function(req, res) {

    res.render("index", {title:"Express"});

  });

}

 

路由规则:

express封装了多种http请求方式,我们主要只是用get和post两种,即app.get()和app.post()。

app.get()和app.post()的第一个参数都为请求的路径,第二个参数为处理请求的回调函数,回调函数有两个参数分别是req和res,代表请求信息和响应信息。

路径请求及对应的获取路径有以下几种形式:

req.query

//GET   /search?q=tobi+ferret

req.query.q

// =>  "tobi ferret"


//GET  /shoes?order=desc&shoe[color]=blue&shoe[type]=converse

req.query.order

// => "blue"

req.query.shoe.type

// => "converse"

 

req.body

//POST  user[name]=tobi&user[email]=tobi@learnboost.com

req.body.user.name

// => "tobi"


req.body.user.email

//  => "tobi@learnboost.com"


//POST{"name":"tobi"}

req.body.name

// => "tobi"

 

req.params

//GET  /user/tj
req.params.name
// => "tj"

//GET  /file/javascripts/jquery.js
req.params[0]
//  =>  "javascripts/jquery.js"

 

req.param(name)

//?name=tobi
req.param("name")
// => "tobi"

// POST name=tobi
req.param("name")
// => "tobi"


//  /user/tobi  for  /user/:name
req.param("name")
// => "tobi"

不难看出:

req.query : 处理get请求,获取get请求参数

req.params : 处理/:xxx形式的get或post请求,获取请求参数

req.body: 处理post请求,获取post请求体

req.param() : 处理get和post请求,但查找优先级由高低到为

req.params => req.body => req.query

 

 

在routes/index.js中通过调用res.render()渲染模板,并将其产生的页面直接返回给客户端。它接受两个参数,第一个是模板的名称,即views目录下的模板文件名,扩展名.ejs可选。第二个参数是传递给模板的数据对象,用于模板翻译。

注意:我们通过app.use(express.static(path.join(__dirname, "public")))设置了静态文件目录为public文件夹,所以模板中的href="stylesheets/style.css"就相当于href="public/stylesheets/style.css"

ejs的标签系统非常简单,它只有以下三种标签:

<% code %>  javascript代码

<%= code %> 显示替换过HTML特殊字符的内容

<%- code %> 显示原始HTML内容

 

/ : 首页

/login : 用户登录

/reg : 用户注册

/post : 发表文章

/logout : 登出

我们要求/login和/reg只能是未登录的用户访问,而/post和/logout只能是已登录的用户访问。左侧导航列表则针对已登录和未登录的用户显示不同的内容。

如何针对已登陆和未登录的用户显示不同的内容呢?或者说如何判断用户是否已经登陆了呢?进一步说如何记住用户的登录状态呢?我们通过引入会话(session)机制记录用户登陆状态,还要访问数据库来保存和读取用户信息。

 

 

Swig使用指南

http://www.cnblogs.com/elementstorm/p/3142644.html

nodejs前端工具总结

http://www.cnblogs.com/elementstorm/archive/2013/04/10/3012679.html

减少javascript垃圾回收

http://www.cnblogs.com/elementstorm/archive/2012/04/02/2430567.html

百度  html文字基线

ECMAScript 继承机制实现

http://www.w3school.com.cn/js/pro_js_inheritance_implementing.asp

隐退的情色女星,悲喜两重天

http://ent.qq.com/a/20150505/064993.htm#p=5

 

express4.8之microblog学习笔记

https://cnodejs.org/topic/540833010256839f71e05fdc

 

Mongoose学习参考文档

https://cnodejs.org/topic/504b4924e2b84515770103dd

 

4.x API

http://expressjs.com/4x/api.html

 

nswbmw/N-blog

https://github.com/nswbmw/N-blog/wiki/_pages

 

posted @ 2015-04-28 18:10  醉酒笑红尘  阅读(460)  评论(0编辑  收藏  举报