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
https://github.com/nswbmw/N-blog/wiki/_pages