7_express

作者: 哈士奇大叔 | 来源:发表于2020-04-29 16:48 被阅读0次

    Express框架

    首先我们先安装Node.js

    0.基于express框架,创建项目。

    创建工程目录

    mkdir myNodeExpress01  
    #创建项目
    cd myNodeExpress01
    #进入目录
    

    通过npm init命令给你的应用创建一个package.json 文件。(包含工程的基本信息,以及工程模块的依赖列表)

    npm init
    #具体请看2_node NPM的使用。
    

    在项目的根目录下安装Express并将其保存在依赖列表中。

    npm install express --save
    

    在项目的根目录下创建index.js文件,并在其中调用express 框架提供的方法,搭建web服务器。

    //引入express模块
    const express=require('express');
    
    const webApp=express();
    const port=2222;
    
    // 根据不同的请求处理业务
    webApp.get('/',(req,res)=>{
        res.send('这是我的第一个express 应用');
    })
    webApp.get('/login',(req,res)=>{
        res.send('这是我的的登录');
    })
    
    webApp.listen(port,()=>{
        console.log(`server is running at http://127.0.0.1:${port}`);
    });
    

    以上是使用express 搭建一个基本的Web服务器的代码示例.

    1.快速入门

      npm提供了大量的第三方模块,其中不乏有许多web框架,之所以选择使用Express作为开发框架,因为他是目前最稳定,使用最广泛,而且Node.js官方推荐的唯一一个WEB开发框架。
      Express除了为http模块提供了更高层的接口外,还实现了许多功能,其中包括:

    • 路由控制
    • 模板解析
    • 动态视图
    • 用户会话
    • CSRF保护
    • 静态文件服务
    • 错误控制器
    • 访问日志
    • 缓存
    • 插件支持
        Express 不是一个无所不能的全能框架,他只是一个轻量级的web框架,多数功能只是对HTTP协议中常用的操作的封装,更多的功能需要插件或者整合其他模块来完成。

    1.1 安装express

    $ npm install -g express //全局安装
    

    等待安装完成后,我们可以在命令行下通过express 命令快速创建一个项目。
    在使用以下命令安装express-generator(应用构造器)

    应用程序生成器:
    我们可以通过npx 命令来安装express 应用程序生成器。

    mkdir myNodeExpress02
    cd myNodeExpress02
    npx  express-generator
    

    也可以使用npm 命令安装Express应用程序生成器

    npm install -g express-generator
    
    $ npm install express-generator -g 
    

    1.2 建立工程&启动工程(使用express-generator应用构造器创建项目)

      通过以下命令建立网站的基本解构

    $ express projectName
    // projectName 要创建的项目名称
    

    当前目录下会出现一个projectName的子目录,并且创建一些文件:

       create : projectName/
       create : projectName/public/
       create : projectName/public/javascripts/
       create : projectName/public/images/
       create : projectName/public/stylesheets/
       create : projectName/public/stylesheets/style.css
       create : projectName/routes/
       create : projectName/routes/index.js
       create : projectName/routes/users.js
       create : projectName/views/
       create : projectName/views/error.jade
       create : projectName/views/index.jade
       create : projectName/views/layout.jade
       create : projectName/app.js
       create : projectName/package.json
       create : projectName/bin/
       create : projectName/bin/www
    
        // 执行如下操作
       change directory:
         $ cd projectName   //进入项目的根目录
    
       install dependencies:
         $ npm install    //安装项目需要的依赖
    
       run the app:
         $ DEBUG=projectname:* npm start  //启动项目
    

      项目启动后,在浏览器输入http://localhost:3000,访问项目。

    1.3 工程结构

    1.3.1 app.js 和入口文件

    app.js 是工程的配置文件,

    
    var createError = require('http-errors');
    // http错误处理模块
    var express = require('express');
    // express 模块
    var path = require('path');
    var cookieParser = require('cookie-parser');
    // cookie 模块
    var logger = require('morgan');
    // 日志模块
    
    // 引入的路由模块
    var indexRouter = require('./routes/index');
    var usersRouter = require('./routes/users');
    
    var app = express();
    
    // 视图引擎的设置
    app.set('views', path.join(__dirname, 'views'));
    // 设置视图目录
    app.set('view engine', 'ejs');
    // 设置模板引擎  官方提供了jade ,ejs;ejs 更接近于HTML语法,推荐使用
    
    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/', indexRouter);
    app.use('/users', usersRouter);
    
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      next(createError(404));
    });
    
    // error handler
    app.use(function(err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    
    

    ./bin/www 是工程的入口文件。

    
    // 以下文件内容相较于实际项目有缩减
    /**
     * Module dependencies.
     */
    
    var app = require('../app');
    var debug = require('debug')('projectname:server');
    var http = require('http');
    
    /**
     * Get port from environment and store in Express.
     */
    
    var port = normalizePort(process.env.PORT || '3000');
    app.set('port', port);
    
    /**
     * Create HTTP server.
     * 创建web服务器
     */
    
    
    var server = http.createServer(app);
    
    /**
     * Listen on provided port, on all network interfaces.
     * 添加web 服务器端口监听
     */
    
    server.listen(port,function(){
      console.log('server is running ,port is '+port);
    });
    
    
    
    1.3.2 public 静态资源目录

      public中存放站点所需要的静态资源,比如图片,css,js,font等
    配置静态资源目录,进入app.js 文件,使用以下代码:

    // 静态资源目录的配置 静态资源挂载
    app.use('/static',express.static(path.join(__dirname, 'public')));//给静态资源设置虚拟目录
    app.use(express.static(path.join(__dirname, 'public')));//默认
    
    1.3.3 views 视图(ejs模板)目录

       此目录下存放视图文件。

    1.3.4 routes 路由文件目录

       此目录下存放路由文件。

    2. 路由控制

      路由是为了处理不同的请求(url)执行的不同的操作。
    我们要为路由提供请求的URL和其他需要的GET,POST,以及参数,之后路由需要根据这些数据来执行相应的代码。

    2.1 工作原理

      express 是一个典型的MVC架构,浏览器发起请求,有路由控制器接受,根据不同的路径定向到不同的控制器,控制器处理用户的具体请求(具体业务),可能会访问数据库中的对象,即模型部分。控制器还要访问模板引擎,生成视图HTML,最后再由控制器返回给浏览器,完成一次请求。

    2.2创建路由规则

      在routes/index.js 文件中,有个已有的路由规则 router.get('/',function(){});

    router.get('/',function(req,res){
        res.send('123332132123132123');
    })
    

    2.3路径匹配规则

    //router.get('/a/:parm1/:parm2');
    // http://localhost:3000/a/parm1_val/parm2_val
    // 取值时,使用req对象中的params对象取值。
    router.get('/a*/:username',function(req,res){
        res.send('参数:'+req.params.username);
    })
    

      路径规则/a/:username会被自动编译为正则表达式.路径参数可以在响应函数中通过req.params 的属性访问。

    2.4 REST风格的路由规则

      Express 支持REST风格的请求方式,REST(表征状态转移Representational State Transfer),它是一种基于HTTP协议的网络应用的接口风格,利用HTTP的方法实现统一风格接口的服务。HTTP协议定义了以下8中标准的方法:

    • GET:请求获取指定资源(获取数据);
    • HEAD:请求指定资源响应头 (获取响应头信息);
    • POST:向指定的资源提交数据(发送数据);
    • PUT:请求服务器存储的一个资源 (存储数据);
    • DELETE:请求服务器删除指定资源 (删除数据);
    • TRACE:回显服务器收到的请求,主要用于测试或者诊断
    • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
    • OPTIONS:返回服务器支持的请求方法。
      我们最常用的是GET,POST,PUT 和DELETE 方法。根据REST设计模式,这4种方法通常分别用于实现以下功能:
    • GET:获取
    • POST:新增
    • PUT:更新
    • DELETE: 删除
        Express 对每种HTTP请求方法都设计了不同的路由绑定函数。
    请求方式 绑定函数
    GET app.get(path,callback)
    POST app.post(path,callback)
    PUT app.put(path,callback)
    DELETE app.delete(path,callback)
    PATCH app.patch(path,callback)
    TRACE app.trace(path,callback)
    CONNECT app.connect(path,callback)
    OPTIONS app.options(path,callback)
    所有方法 app.all(path,callback)

      需要注意的是app.all函数,它支持把所有的请求方式绑定到同一个响应函数。

    2.5 控制权转移

    //routes/user.js
    var users={ 
        username:'huskyuncle',
        password:'123456' 
    }
    router.all('/:username',function(req,res,next){
      // 检查用户是否存在
      if(users['username']==req.params.username){
        // 用户存在 
        next();
      }else{
        next(new Error(req.params.username+' 找不到数据'));
      }
    })
    router.get('/:username',function(req,res){
      // 用户存在,直接展示用户数据 
      res.send(JSON.stringify(users['username']+users['password']));
    })
    

      router.all定义的这个路由规则实际上起到了中间件作用,把相似的请求的相同部分提取出来,有利于代码维护其他next方法如果接受了参数,也就代表发生错了,这种方式可以把错误检查分段化,降低代码的耦合度。

    3. 模板引擎

      模板引擎(Template Engine)是一个从页面模板根据一定的规则生成HTML的工具。
      Express 内置ejs和jade 两种模板引擎(建议使用ejs),我们在Express框架中使用时,在app.js中通过以下语句设置了模板引擎和页面模板的位置:

    app.set('views',__dirname+'/views');//设置页面模板位置
    app.set('views engine','ejs');//设置使用的模板引擎
    

    渲染页面时,我们在响应对象函数中使用res.render()渲染模板

    router.get('/',function(req,res){
        // render(viewName,viewData);
        // *viewName 视图名称
        res.render('index',{data:'数据'});
    })
    

    ejs的标签系统,常用三种标签

    • <% code %> JavaScript代码
    • <%= code %> 显示替换过HTML特殊字符的内容|输出变量内容
    • <%- code %> 显示原始的HTML内容
    • <%- include('common/header',data); %> 在模板页中引入另外一个模板页,并且传输data参数给指定的模板页面(common/header)。

    相关文章

      网友评论

        本文标题:7_express

        本文链接:https://www.haomeiwen.com/subject/zxlnwhtx.html