express

1、express介绍:

  Express是简介灵活的nodeJs web应用开发框架

  它提供了一系列强大的功能:路由控制、参数获取、中间件、send和sendFie、

                 静态文件服务器、模板解析、重定向

2、使用express:

  安装:npm install express

  三步骤:

    var express = require("express");

    var app = express();

    app.listen(8080);

3、路由:

  get请求:   app.get( '/', function( req, res ){  res.end("首页") })

      -- request:   请求对象 获取客户端的请求

      -- response:   响应对象 向客户端发送响应

      -- ren.end()   只能放字符串+buffer,

      -- ren.send()  能接任何类型的参数  

  app.all: app.all("*",function( req, res ){  res.end("此页面不存在")  })

      --  all匹配所有的方法名,  * 代码匹配所有的路径

 

/* 用户:  user/signup 登录         user/signin   注册         user/sigout  退出
文章: article/add 添加文章 article/list 文章列表 */

  

    

    

 

 4、获取请求参数:

  app.get("/food",function (req,res) {
     console.log( req.method ); //请求方法
     console.log( req.url ); //请求的url
     console.log( req.path ); //pathname /food
     console.log( req.query ); //查询字符串对象
     console.log( req.headers ); //请求头对象
    res.end();
  });

  params路径参数:"/user/:id/:name"

  app.get("/user/:id/:name" , function(){

    console.log( req.params.id );    //动态传递id,根据id获取相关内容

    console.log( req.params.name );

    console.log( req.params.host );

    //获取端口号+域名

    console.log( req.headers );  //整个头部信息

    console.log( req.headers.host );  //获取端口号+域名,单独获取只需要分割一下。

  })

   例子:

    

 

5、中间件 - use:

    use的作用:1、添加公共的处理逻辑。 2、给请求或响应对象上增加公用的方法和属性 req.path

    app.use('/',function( req, res, next ){

      //中间件本身也是一个函数

      //next  是一个函数,调用它表示向下执行,  不调用会直接卡在此处或者直接结束

    })

 

6、静态文件 public

  -- public:参数是静态文件根目录
  -- path.join( __dirname, 'public' ) 当前文件的绝对路径
  -- path.resolve('public') 与上相等,找到public的绝对路径
  -- 此中间件先会去静态目录下找,找到直接返回,未找到,next向下执行看有没有路由能执行
  app.use( express.static( path.resolve('public') ) );         //匹配所有
  app.use('/user', express.static( path.resolve('public') ) );     //匹配user

  设置模板引擎

  app.set('view engine','html'); // ejs html设置模板引擎,就相当于设置了一个变量,用get读

  app.set('views',path.resolve('views') ); //设置模板存放的根目录 前:key 后:目录

  app.engine('html',require('ejs').__express ); //如果模板后缀是html的话 用ejs的方法渲染来进行     ejs需要安装

   -- 多个模板都会用到的变量,而且变量值都一样的情况下 ,可以提取出来写

   app.use(function (req,res,next) {
    res.locals.title = "title";
    next();
   });

   app.get('/users',function (req,res,next) {   // get 配置路由 + 获取变量
      res.locals.users = users ;    //真正渲染的时候,会把数据对象的属性全部拷贝给 res.locals
      res.render( 'user.html',{ users:users , title:"title" } );  // 1参:相对路径,相对于views的 2参:数据对象

      //渲染视图,只能写相当于路径 后缀可略
      //res.render( 'user' );
   });

 

  解析json:

  -- body-parser   需要安装; npm  install  body-parser

  var bodyParser = require('body-parser');    //解析json

  --当请求体的类型是urlencoded格式的话,用此中间件请求体转成对象

  --url只能放ascii,128个,如果传中文,要将中文转ascii使用 encodeURIComponent('中文');

  app.use( bodyParser.urlencoded( {extended:true} ) );  //解析设置  提交表单的时候

  app.use( bodyParser.json() );            

 

  eg:

    var express = require("express");
    var path = require("path");
    var bodyParser = require("body-parser"); //解析json
    var cookieParser = require('cookie-parser'); //cookie-parser
    var app = express();

    app.use( cookieParser() ); //使用cookieParser中间件只会 会增加req.cookies属性
    app.use( bodyParser.urlencoded( { extended:true }) ); //解析设置
    app.use( bodyParser.json() );

    app.set('view engine','html');
    app.set("views",path.resolve('views'));
    app.engine('html',require('ejs').__express ); //解析html中的ejs

    var users =[];
    /*---------------------注册--------------------*/
    app.get('/signup',function (req,res) {
     var error = req.cookies.error;
     res.clearCookie('error'); //清除cookies
     res.render('up',{ error });
    });
    app.post('/signup',function (req,res,next) {
     var user = req.body;
     //找一下用户数组中有没有相同用户名的用户
     var oldUser = users.find(function ( item ) {
     return item.username == user.username;
     });
     if(oldUser){ //找到了用户名,跳到注册页重写
     res.cookie('error','此用户名已经被占用');
     res.redirect('back');
     }else {
     //没找到就注册,并且跳到登陆页面
     users.push( user );
     res.redirect('/signin')
     }
    });

    /*-------------------登陆----------------------*/
    app.get('/signin',function (req,res) {
     var error = req.cookies.error;
     res.clearCookie('error'); //清除cookies
     res.render('in');
    });
    app.post('/signin',function (req,res,next) {
     var user = req.body;
     var flag = users.find(function ( item ) {
     return user.username == item.username && user.password == item.password
     });
     if( flag ){
     res.cookie('yes','登陆成功...');
     res.redirect('/welcome')
     }else {
     res.cookie('error','用户名密码错误'); //error会覆盖上面的error
     res.redirect('back');
     }
  
    });
    app.get('/welcome',function (req,res,next) {
     var yes = req.cookies.yes;
     res.render('welcome',{ yes })
    })

    app.listen(9090);

 

posted @ 2017-03-11 14:10  陌悠尘  阅读(983)  评论(0编辑  收藏  举报