上一节讲了express的目录结构和其中一些文件的主要内容,今天补充express的路由控制
上面提到过 app.js 中
var users = require('./routes/index'); app.use('/', index);可以用以下代码取代:
app.get('/', function(req, res){ res.render('index', { title: 'Express' }); };)这段代码的意思是当访问主页时,调用 ejs 模板引擎,来渲染 index.html模版文件(即将 title 变量全部替换为字符串 Express),生成静态页面并显示在浏览器里。
我们把路由放到一个单独的文件routes/routes.js文件,便于我们管理路由。把实现路由的函数抽取出来plugins文件夹下
修改下面代码
app.set('view engine', 'ejs');修改后,依然使用ejs引擎,但文件后缀名已经变为我们熟悉的html
app.set('view engine', 'html'); app.engine('html', require('ejs').__express);在 app.js 最后添加一行代码:
routes(app);这里只放登录注册部分代码,博客方面可以自己试着扩展,如果实在写不出,参考github地址:https://github.com/Destinygu/node-blog ,修改 routes.js 如下:
var userPlugin = require('../plugins/user'); module.exports = function (app) { app.use(function (req, res,next) { var user = req.session.user; if(user){ //一次性存入的变量 app.locals.user = user; }else{ app.locals.user = user; } next(); }); //首页 app.get('/',blogPlugin.indexList.get); //登录 app.get('/login',userPlugin.loginNo.no,userPlugin.login.get); app.post('/login',userPlugin.login.post); //注册 app.get('/reg',userPlugin.loginNo.no,userPlugin.reg.get); app.post('/reg',userPlugin.reg.post); //404 app.use(function(req, res){ res.render("404"); }); };express 封装了多种 http 请求方式,我们主要只使用 get 和 post 两种。get和 post的第一个参数为请求的路径,第二个参数为处理请求的回调函数,回调函数有两个参数分别是 req 和 res,代表请求信息和响应信息 。路径请求及对应的获取路径有以下几种形式:
req.query : 处理 get请求
req.params : 处理 /:xxx形式的 get请求
req.body : 处理 post请求
req.param() : 可以处理 get和 post请求,但查找优先级由高到低为req.params→ req.body→ req.query
注意以上不带括号的为非函数,使用时如:req.params.user,至此我们新建文件plugins/user.js
var ModelUser = require('../model/user'); var crypto=require('crypto'); //登录 module.exports.login = { get : function(req,res,next){ res.render('login',{title:'login'}); }, post : function (req, res, next) { var postData = { email : req.body.email }; var md5=crypto.createHash('md5'); var password_md5 =md5.update(req.body.password).digest('hex'); var resJson = { status: false, msg: '' }; // 向界面返回获取到的数据 // res.send(postData); ModelUser.findOne(postData,function (err, data) { if(err){ console.log(err); } if(data) { if (data.password == password_md5) { req.session.user = data; resJson.msg = '登录成功'; resJson.status = true; res.send(resJson); // res.redirect('/user/'+data._id); } else { resJson.msg = '密码错误'; res.send(resJson); } }else{ resJson.msg = '没有此用户'; res.send(resJson); } }); } }; //注册 module.exports.reg = { get : function(req,res,next){ res.render('reg',{title:'reg'}); }, post: function(req,res,next){ //进行md5加密 var md5=crypto.createHash('md5'); var password_md5 =md5.update(req.body.password).digest('hex'); var postData = { name : req.body.name, password :password_md5, email : req.body.email }; var resJson = { status : false, msg : '' }; ModelUser.findOne({ email:req.body.email },function (err, data) { if( err ) console.log(err); if(data){ resJson.msg = '此邮箱已被注册'; res.send(resJson); }else{ ModelUser.create(postData,function (err, data) { if(err){ resJson.msg = '注册错误'; res.send(resJson); console.log(err); }else{ resJson.msg = '注册成功'; resJson.status = true; req.session.user = data; res.send(resJson); } }); } }); } };虽然express现在默认的模板引擎是jade,但个人比较喜欢用ejs,写法上感觉有点像jsp,下面简单介绍到本站开发用到的ejs技术。
ejs 的标签有三种: <% code %>:JavaScript 代码。 <%= code %>:显示替换过 HTML 特殊字符的内容。 <%- code %>:显示原始 HTML 内容。
注意: <%=code%> 和 <%- code%> 的区别,当变量 code 为字符串时,两者没有区别。当 code 比如为 <h1>node</h1>时, <%=code %> 会原样输出<h1>node</h1> ,而 <%-code%> 则会将h1解析出大标题node。
模块的逻辑支持
所有使用 <% %> 括起来的内容都会被编译成 Javascript,你可以在模版文件中像写 js 一样写自己的代码,也允许你声明变量,作用域就是当前模版,因为一个模版会被编译成一个 Javascript 函数,这点真的很像Jsp 示例:
<% var name = "littledu" %> <div> Hello, My Name is <%-name %> </div>循环
就像写 Javascript 一样
<ul> <% for(var i = 0; i < 10; i++) {%> <li>我是列表 <%-i %></li> <% } %> <ul>Includes
Include 可以引用相对路径的模版文件,在view中创建common文件夹,添加header.js,footer.js。
header.js
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> </head> <body>footer.js
</body> </html>于是view目录下的index.html就可以写成这样
<% include common/header.html %> <h1>我是主页</h1> <% include common/footer.html %>考虑单独抽取部分来讲会比较容易理解,但难免在抽取中有所遗漏,希望大家指出。差不多准备考试了,今天就更到这…