• Express NodeJs Web框架 入门笔记


    Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。

    • 使用 Express 可以快速地搭建一个完整功能的网站。
    • Express 框架核心特性:
    • 可以设置中间件来响应 HTTP 请求。
    • 定义了路由表用于执行不同的 HTTP 请求动作。
    • 可以通过向模板传递参数来动态渲染 HTML 页面。

    前提知识

    • NodeJs

    • NPM

    创建项目

    • 初始化

    这里我们使用npm初始化一个项目,直接回车使用默认参数

    $ mkdir ~/myExpress
    $ cd ~/myExpress
    $ npm init	
    
    • 安装Express
    $ npm install express --save
    
    • 创建入口文件app.js
    $ touch app.js
    

    基础示例

    使用IDE打开项目(推荐Vscode或者WebStorm) 编辑app.js文件

    // 引入依赖
    var express = require('express')
    var app = express()
    
    // 定义port常亮
    const port = 3030;
    
    // 创建一个简单GET路由
    app.get("/",function(req,res){
        res.send("Hello,World");
    });
    
    // 启动服务,第二个参数为callback() 
    app.listen(port,function(){
        console.log(`Express 应用启动在${port} 端口`);
    });
    

    命令行切换到app.js目录下

    $ node app.js
    

    打印出Express 应用启动在3030 端口,在浏览器或者CURL访问http://localhost:3030即可看到Hello,World

    $ curl -XGET http://localhost:3030/
    

    路由设置

    在上面的代码示例中我们使用了一个简单HelloWorld代码,使用了GET的请求方式,同样的Express也支持其他的Method,如POST,PATCH,DELETE等等,下面我们简单的写一下

    // 引入依赖
    var express = require('express')
    var app = express()
    
    // 定义port常亮
    const port = 3030;
    
    // 创建一个简单GET路由
    app.get("/",function(req,res){
        res.send("Hello,World");
    });
    
    app.post("/post",function(req,res){
        var method = req.method;
        res.send(`发现${method} 请求`)
    });
    
    app.patch("/patch",function(req,res){
        var method = req.method;
        res.send(`发现${method} 请求`)
    });
    
    app.delete("/delete",function(req,res){
        var method = req.method.name;
        res.send(`发现${method} 请求`)
    });
    
    // 启动服务,第二个参数为callback() 
    app.listen(port,function(){
        console.log(`Express 应用启动在${port} 端口`);
    });
    

    如果你需要添加全部的请求方式,可以使用app.all(path,callback);

    由于POST等请求不能再浏览器输入地址访问,这里我们继续使用CURL来测试,没有这个工具的可以使用PostMan测试.

    $ curl -XGET http://localhost:3030        
    Hello,World
    
    $ curl -XPOST http://localhost:3030/post   
    发现POST 请求
    
    $ curl -XPATCH http://localhost:3030/patch  
    发现PATCH 请求
    
    $ curl -XDELETE http://localhost:3030/delete
    发现DELETE 请求 
    

    静态文件

    Express可以设置某个目录为静态文件目录,里面的资源我们可以直接通过URL访问,在app.js同级目录下执行以下脚本

    $ mkdir public && cd public
    $ echo "<h1>这里是静态资源文件内容</h1?" >> ./static.html
    

    修改app.js文件,添加以下代码

    app.use(express.static('public'))
    

    访问http://localhost:3030/static.html

    $ curl -XGET http://localhost:3030/static.html
    <h1>这里是静态资源文件内容</h1>
    

    同样的,你也可以放入其他类型的资源,如JSON文件,图像,纯文本,CSS等.

    Route模块

    在上面示例中,我们可以使用下面的代码创建路由

    var express = require('express')
    var app = express()
    
    app.get("/",function(req,res,next){})
    
    app.get("/book",function(req,res,next){})
    
    app.post("/book",function(req,res,next){})
    

    显然这样并不利于我们的代码管理,因此这里引入express.Route模块来模块化处理路由,下面我们有如下需求:

    • 创建 GET /

    • 创建 GET /book/nodejs

    • 创建POST /book/

      其中 /book/**单独存放于路由模块中

    app.js同级目录下创建book.js文件代码内容如下:

    var express = require('express');
    // 创建router
    var router = express.Router();
    
    // 在router中设置路由
    router.get('/:id', function (req, res, next) {
        var book = {
            id: req.params.id,
            name: "深入浅出NodeJS"
        };
        res.send(JSON.stringify(book))
    });
    
    router.post("/", function (req, res, next) {
        res.send("POST /book")
    });
    
    // 对外暴露
    module.exports = router;
    

    同样的app.js则需要引入上面router文件

    // 引入依赖
    var express = require('express')
    var app = express()
    
    // 引入router
    var book_router = require('./book')
    
    // 定义port常亮
    const port = 3030;
    
    
    // app 使用该router
    app.use('/book',book_router)
    
    // 创建一个简单GET路由
    app.get("/",function(req,res){
        res.send("Hello,World");
    });
    
    
    // 启动服务,第二个参数为callback() 
    app.listen(port,function(){
        console.log(`Express 应用启动在${port} 端口`);
    });
    

    启动应用,在命令行中访问,即结果如下:

    $ curl -XGET http://localhost:3030/             
    Hello,World
    
    $ curl -XGET http://localhost:3030/book/ISBN-123
    {"id":"ISBN-123","name":"深入浅出NodeJS"}
    
    $ curl -XPOST http://localhost:3030/book/       
    POST /book
    

    NodeJs中的中间件

    中间件,英文middleWare ,假设我们需要在控制台打印所有请求的消耗的时间信息,以及URL,那么我们给每个路由都加上代码,显然是很愚蠢的,那么我们可以为这些路由请求设置中间件,利用中间件来而完成统计.

    修改appjs代码为以下内容:

    // 引入依赖
    var express = require('express')
    var app = express()
    
    const port = 3030
    
    /**
     *  定义中间件函数
     * @param req   ---> requesr
     * @param res   ---> response
     * @param next  ---> 将请求传递到下一个中间件函数
     */
    function logMiddleWare(req, res, next) {
        var url = req.originalUrl;
        // 记录开始执行时间
        var start = Date.now();
        // 向request中写入数据,在后面的中间件函数中可以获取到该参数
        req.start_time = start
        // 执行下一个中间件函数(在这里也就是路由的callback)
        next();
        // 记录完成时间
        var end = Date.now();
        // 打印日志
        console.log(`${url} 请求完成时间:`, end - start, "ms");
    }
    
    // 使用该中间件
    app.use(logMiddleWare)
    
    app.get("/time", function (req, res, next) {
        console.log(`获取到的参数start_time = ${req.start_time}`);
        res.send(`<h1>/${req.start_time}</h1>`);
    });
    
    // 服务启动
    app.listen(port, function () {
        console.log(`服务启动在${port} 端口`);
    });
    

    我们测试以下:

    curl -XGET http://localhost:3030/time 返回<h1>1541220185998</h1>,这里主要看一下控制台打印的信息

    服务启动在3030 端口
    获取到的参数start_time = 1541220185998
    /time 请求完成时间: 6 ms
    

    可以看到,首先是服务启动在3030 端口信息,接着我们开始请求/time,记录下了start_time,并写入到request中,接着在/time的回调函数中打印了该参数,执行完成之后,继续返回到 logMiddleWare 中记录下end_time,打印出耗时 6 ms

    集成持久层(redis)

    NodeJS支持多种数据库持久操作,比如常用的Redis,Mysql,MongoDB等等,那么这里我们简单的使用redis作为测试以下.首先说一下需求:

    • 创建一个请求为 POST /redis/:content 将content写入到redis中

    • 创建一个请求为 GET /redis 用户获取之前的设置

    Ps: 这里我是用了docker来部署了一个redis服务器,如下

    $ docker pull redis
    $ docker run -d -p 6379:6379 --name redis_6379 redis
    $ docker ps # 观察Redis运行情况
    # 重启redis  `docker restart redis_6379`
    

    首先你需要安装redis依赖,项目目录下执行npm install redis --save安装即可,修改app.js内容如下

    // 引入依赖
    var express = require('express');
    var redis = require('redis')
    var app = express()
    
    const port = 3030
    const redis_port = 6379
    
    // 创建Redis client 端口为6379
    var client = redis.createClient(redis_port,'localhost');
    
    /**
     * 设置Redis的回调事件,当redis出现连接失败的时候,执行之
     */
    client.on('error',function (error) {
        console.log("Redis 连接出现异常")
    });
    
    
    app.post("/redis/:content",function (req, res, next) {
        var content = req.params.content;
        // 设置字符串到redis中 KV结构
        client.set('KEY',content)
        res.send("Redis设置完成")
    })
    
    app.get("/redis",function (req, res, next) {
        client.get('KEY',function (err, value) {
            res.send(value)
        })
    })
    
    // 服务启动
    app.listen(port, function () {
        console.log(`服务启动在${port} 端口`);
    });
    

    测试内容如下

    $ curl -XPOST http://localhost:3030/redis/Keep_it_simple_and_stupid
    Redis设置完成
    
    $curl -XGET http://localhost:3030/redis 
    Keep_it_simple_and_stupid 
    

    当然也可以在Redis客户端中查询数据

  • 相关阅读:
    python日期格式化,字符串格式化
    python3+django+mysql
    django ORM排序
    CentOS7 编译安装python3.5
    笔记
    python添加pip本地源
    centos7 安装chrome浏览器
    mysql 存储过程-1基础
    mysql中的describe语法 以及查看 当前库中所有表和字段信息
    python 可变类型和不可变类型
  • 原文地址:https://www.cnblogs.com/zhoutao825638/p/10382299.html
Copyright © 2020-2023  润新知