美文网首页跨平台
Node.js了解之Express

Node.js了解之Express

作者: 平安喜乐698 | 来源:发表于2020-04-05 16:55 被阅读0次
    目录
    
    

    曾经沧海难为水,除却巫山不是云。
    本文为本人略读官网文档后的大略笔记,实在不适合他人阅读。

    前言

    Express:Web应用框架

    核心特性:
        1. 可通过设置中间件来响应http请求。
        2. 可定义路由表去响应不同的http请求。
        3. 可通过向模板传递参数来动态渲染HTML页面。
    

    安装

    cnpm install express --save
    
    // node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
    cnpm install body-parser --save
    
    // 解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象
    cnpm install cookie-parser --save
    
    // 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据
    cnpm install multer --save
    

    1. Hello World

    test.js

    var express = require('express');
    var app = express();
     
    app.get('/', function (req, res) {
       res.send('Hello World');
    })
     
    var server = app.listen(8088, function () {
      var host = server.address().address
      var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    })
    

    node test.js

    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088,运行效果

    2. 请求和响应

    request对象 处理请求数据
    response对象 处理响应数据
    
    app.get('/', function (req, res) {
       // --
    })
    
     request对象
        包含了http请求的数据(请求查询字符串、参数、内容、HTTP头等属性。
        1. req.app
          当callback为外部文件时,用req.app访问express的实例
        2. req.baseUrl
          获取路由当前安装的URL路径
        3. req.body / req.cookies
          获取 请求体body、Cookies
        4. req.fresh / req.stale
          判断请求是否还「新鲜」
        5. req.hostname / req.ip
          获取主机名、IP地址
        6. req.originalUrl
          获取原始请求URL
        7. req.params
          获取路由的parameters
        8. req.path
          获取请求路径
        9. req.protocol
          获取协议类型
        10. req.query
          获取URL的查询参数串
        11. req.route
          获取当前匹配的路由
        12. req.subdomains
          获取子域名
        13. req.accepts()
          检查可接受的请求的文档类型
        14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
          返回指定字符集的第一个可接受字符编码
        15. req.get()
          获取指定的HTTP请求头
        16. req.is()
          判断请求头Content-Type的MIME类型
    
    Response对象
        包含了http响应的数据。
        1. res.app
          同req.app一样
        2. res.append()
          追加指定HTTP头
        3. res.set()
          在res.append()后将重置之前设置的头
        4. res.cookie(name,value [,option])
          设置Cookie
          opition: domain / expires / httpOnly / maxAge / path / secure / signed
        5. res.type()
          设置Content-Type的MIME类型
        6. res.clearCookie()
          清除Cookie
        7. res.download()
          传送指定路径的文件
        8. res.get()
          返回指定的HTTP头
        9. res.json()
          传送JSON响应
        10. res.jsonp()
          传送JSONP响应
        11. res.location()
          只设置响应的Location HTTP头,不设置状态码或者close response
        12. res.redirect()
          设置响应的Location HTTP头,并且设置状态码302
        13. res.render(view,[locals],callback)
          渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
        14. res.send()
          传送HTTP响应
        15. res.sendFile(path [,options] [,fn])
          传送指定路径的文件 -会自动根据文件extension设定Content-Type
        16. res.set()
          设置HTTP头,传入object可以一次设置多个头
        17. res.status()
          设置HTTP状态码
    

    3. 路由

    路由负责提取http请求的URL以及GET/POST参数,然后指定谁来响应。

    test.js

    var express = require('express');
    var app = express();
     
    //  主页输出 "Hello World"
    app.get('/', function (req, res) {
       console.log("主页 GET 请求");
       res.send('Hello GET');
    })
     
     
    //  POST 请求
    app.post('/', function (req, res) {
       console.log("主页 POST 请求");
       res.send('Hello POST');
    })
     
    //  /del_user 页面响应
    app.get('/del_user', function (req, res) {
       console.log("/del_user 响应 DELETE 请求");
       res.send('删除页面');
    })
     
    //  /list_user 页面 GET 请求
    app.get('/list_user', function (req, res) {
       console.log("/list_user GET 请求");
       res.send('用户列表页面');
    })
     
    // 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
    app.get('/ab*cd', function(req, res) {   
       console.log("/ab*cd GET 请求");
       res.send('正则匹配');
    })
     
     
    var server = app.listen(8088, function () {
     
      var host = server.address().address
      var port = server.address().port
     
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
     
    })
    

    node test.js

    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/list_user,运行效果 浏览器输入http://127.0.0.1:8088/abcd,运行效果 浏览器输入http://127.0.0.1:8088/abcde,运行效果

    4. 静态文件

    Express提供了内置的中间件express.static来设置静态文件路径(图片, CSS, JavaScript) 。

    app.use('/public', express.static('public'));
    

    例1

    创建public目录,在public目录中创建images目录,存放1.jpg
    

    test.js

    var express = require('express');
    var app = express();
     
    app.use('/public', express.static('public'));
     
    app.get('/', function (req, res) {
       res.send('Hello World');
    })
     
    var server = app.listen(8088, function () {
     
      var host = server.address().address
      var port = server.address().port
     
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    })
    

    node test.js

    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/public/images/1.jpg,运行效果

    5. GET 方法

    1. 例1

    index.html

    <html>
    <body>
    <form action="http://127.0.0.1:8088/process_get" method="GET">
    First Name: <input type="text" name="first_name">  <br>
     
    Last Name: <input type="text" name="last_name">
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>
    

    test.js

    var express = require('express');
    var app = express();
     
    app.use('/public', express.static('public'));
     
    app.get('/index.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "index.html" );
    })
     
    app.get('/process_get', function (req, res) {
     
       // 输出 JSON 格式
       var response = {
           "first_name":req.query.first_name,
           "last_name":req.query.last_name
       };
       console.log(response);
       res.end(JSON.stringify(response));
    })
     
    var server = app.listen(8088, function () {
     
      var host = server.address().address
      var port = server.address().port
     
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
     
    })
    

    node test.js

    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/index.htm,运行效果 submit

    6. POST方法

    1. 例1

    index.html

    <html>
    <body>
    <form action="http://127.0.0.1:8088/process_post" method="POST">
    First Name: <input type="text" name="first_name">  <br>
     
    Last Name: <input type="text" name="last_name">
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>
    

    test.js

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
     
    // 创建 application/x-www-form-urlencoded 编码解析
    var urlencodedParser = bodyParser.urlencoded({ extended: false })
     
    app.use('/public', express.static('public'));
     
    app.get('/index.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "index.html" );
    })
     
    app.post('/process_post', urlencodedParser, function (req, res) {
     
       // 输出 JSON 格式
       var response = {
           "first_name":req.body.first_name,
           "last_name":req.body.last_name
       };
       console.log(response);
       res.end(JSON.stringify(response));
    })
     
    var server = app.listen(8088, function () {
     
      var host = server.address().address
      var port = server.address().port
     
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
     
    })
    

    node test.js

    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/index.htm,运行效果 submit

    6. 文件上传

    index.html

    <html>
    <head>
    <title>文件上传表单</title>
    </head>
    <body>
    <h3>文件上传:</h3>
    选择一个文件上传: <br />
    <form action="/file_upload" method="post" enctype="multipart/form-data">
    <input type="file" name="image" size="50" />
    <br />
    <input type="submit" value="上传文件" />
    </form>
    </body>
    </html>
    

    test.js

    var express = require('express');
    var app = express();
    var fs = require("fs");
     
    var bodyParser = require('body-parser');
    var multer  = require('multer');
     
    app.use('/public', express.static('public'));
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(multer({ dest: '/tmp/'}).array('image'));
     
    app.get('/index.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "index.html" );
    })
     
    app.post('/file_upload', function (req, res) {
     
       console.log(req.files[0]);  // 上传的文件信息
     
       var des_file = __dirname + "/" + req.files[0].originalname;
       fs.readFile( req.files[0].path, function (err, data) {
            fs.writeFile(des_file, data, function (err) {
             if( err ){
                  console.log( err );
             }else{
                   response = {
                       message:'File uploaded successfully', 
                       filename:req.files[0].originalname
                  };
              }
              console.log( response );
              res.end( JSON.stringify( response ) );
           });
       });
    })
     
    var server = app.listen(8088, function () {
     
      var host = server.address().address
      var port = server.address().port
     
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
     
    })
    

    node test.js

    应用实例,访问地址为 http://:::8088
    
    上传成功后输出
    {
      fieldname: 'image',
      originalname: '屏幕快照 2020-04-05 4.28.15.png',
      encoding: '7bit',
      mimetype: 'image/png',
      destination: '/tmp/',
      filename: 'db7a8c97ccb6f956597481812f0faf10',
      path: '/tmp/db7a8c97ccb6f956597481812f0faf10',
      size: 1244437
    }
    {
      message: 'File uploaded successfully',
      filename: '屏幕快照 2020-04-05 4.28.15.png'
    }
    
    浏览器输入http://127.0.0.1:8088/index.htm,运行效果 上传,会传到根目录下

    7. Cookie 管理

    1. 例1

    test.js

    var express      = require('express')
    var cookieParser = require('cookie-parser')
    var util = require('util');
     
    var app = express()
    app.use(cookieParser())
     
    app.get('/', function(req, res) {
        console.log("Cookies: " + util.inspect(req.cookies));
    })
     
    app.listen(8088)
    

    node test.js
    浏览器输入http://127.0.0.1:8088

    终端输出
    
    Cookies: [Object: null prototype] {}
    

    8. RESTful

    REST(Representational State Transfer) 表述性状态转移
    是一种设计风格而不是标准。

    由Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。
    
      是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是RESTful。
      通常基于使用HTTP、URI、XML、HTML这些现有的广泛流行的协议和标准。
      通常使用 JSON 数据格式。
    

    基于 REST架构的 Web Services 即是 RESTful

      由于轻量级以及通过 HTTP直接传输数据的特性, RESTful 已经成为最常见的替代方法。
      可以使用各种语言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。
    
    以下为 REST 基本架构的四个方法:
        1. GET 
          用于 获取数据。
        2. POST 
          用于 添加数据。
        3. PUT 
          用于 更新/添加数据。
        4. DELETE 
          用于 删除数据。
    

    》》》例1

    首先,创建一个 json 数据资源文件 users.json

    {
       "user1" : {
          "name" : "cx",
          "password" : "iloveyou",
          "profession" : "person",
          "id": 1
       },
       "user2" : {
          "name" : "zhouxingchi",
          "password" : "zhuyin",
          "profession" : "star",
          "id": 2
       },
       "user3" : {
          "name" : "liudehua",
          "password" : "china",
          "profession" : "star",
          "id": 3
       }
    }
    
    1. 获取列表 GET

    server.js(获取用户列表)

    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    app.get('/listUsers', function (req, res) {
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           console.log( data );
           res.end( data );
       });
    })
    
    var server = app.listen(8088, function () {
      var host = server.address().address
      var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    })
    

    node server.js (启动服务器,端口为8088)

    输出
    
    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/listUsers,运行效果
    1. 添加 POST

    修改server.js(添加用户)

    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    // 添加的新用户数据
    var user = {
       "user4" : {
          "name" : "zhourunfa",
          "password" : "zhourunfa",
          "profession" : "star",
          "id": 4
       }
    }
    
    app.get('/addUser', function (req, res) {
       // 读取已存在的数据
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           data = JSON.parse( data );
           data["user4"] = user["user4"];
           console.log( data );
           res.end( JSON.stringify(data));
       });
    })
    
    
    var server = app.listen(8088, function () {
    
      var host = server.address().address
      var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    })
    

    node server.js (启动服务器,端口为8088)

    输出
    
    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/addUser,运行效果
    1. 获取指定用户 GET

    修改server.js(创建 :id, 用于读取指定用户的详细信息)

    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    app.get('/:id', function (req, res) {
       // 首先我们读取已存在的用户
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           data = JSON.parse( data );
           var user = data["user" + req.params.id] 
           console.log( user );
           res.end( JSON.stringify(user));
       });
    })
    
    var server = app.listen(8088, function () {
    
      var host = server.address().address
      var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    })
    

    node server.js (启动服务器,端口为8088)

    输出
    
    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/2,运行效果
    1. 删除 DELETE

    修改server.js(删除用户)

    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    var id = 2;
    
    app.get('/deleteUser', function (req, res) {
    
       // First read existing users.
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           data = JSON.parse( data );
           delete data["user" + id];
           
           console.log( data );
           res.end( JSON.stringify(data));
       });
    })
    
    var server = app.listen(8088, function () {
    
      var host = server.address().address
      var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    
    })
    

    node server.js (启动服务器,端口为8088)

    输出
    
    应用实例,访问地址为 http://:::8088
    
    浏览器输入http://127.0.0.1:8088/deleteUser,运行效果

    相关文章

      网友评论

        本文标题:Node.js了解之Express

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