zoukankan      html  css  js  c++  java
  • 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

    /N-blog

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

  • 相关阅读:
    Django ——Timezone 处理
    orm
    MySql系列之初识
    python并发编程之IO模型
    并发编程之协程
    GIL解释锁及进程池和线程池
    线程的互斥锁、递归锁及信号量
    守护、互斥锁、IPC和生产者消费者模型
    并发编程基础(进程)
    网络编程
  • 原文地址:https://www.cnblogs.com/king-bj/p/4463716.html
Copyright © 2011-2022 走看看