zoukankan      html  css  js  c++  java
  • Node.js学习笔记(六) express模块

    Express 是一个 Web 应用框架,可以帮助我们快速搭建一个 Web 应用

    1、Hello World

    下面我们先来搭建一个简单的小型应用,熟悉 Express 的基本使用方法

    1. 首先创建一个新文件夹作为项目的根目录,然后在该文件夹下打开命令行
    2. 然后使用 npm init 命令生成一个 package.json 文件,它是项目的配置文件
    3. 接着使用 npm install --save express 命令安装 Express,它会放在 node_modules 目录下
    4. 最后创建 server.js 文件,并在该文件中编写如下代码:
    // 引入 Express 模块
    var express = require('express')
    // 创建 Express 实例
    var app = express()
    // 设置路由
    app.get('/', function (req, res) {
        res.send('Hello World')
    })
    // 启动服务器,监听端口 5000
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    

    上面就是一个简单的应用程序,我们现在暂时还不需要理解其中的语法,等下将会逐一进行讲解

    最后打开命令行,输入命令 node server.js,打开 http://127.0.0.1:5000/ 即可看到 Hello World 的问候语

    2、基础路由设置

    路由确定 应用程序如何响应特定的客户端请求

    每个路由都可以有一个或多个处理函数,这些函数在路由匹配时执行,语法格式如下:

    app.METHOD(PATH, HANDLER)
    

    其中,METHOD 表示请求方法,PATH 表示匹配路径,HANDLER 表示路由匹配时的处理逻辑

    以下面的代码为例,当客户端以 GET 方法请求根路径资源时,执行匿名函数,发送 Hello World 响应

    app.get('/', function (req, res) {
        res.send('Hello World')
    })
    

    (1)METHOD

    METHOD 定义请求方法,Express 支持所有 HTTP 请求方法,下面是一些例子:

    • app.get(PATH, HANDLER) 定义当使用 GET 方法请求 PATH 路径上的资源时执行逻辑 HANDLER

    • app.post(PATH, HANDLER) 定义当使用 POST 方法请求 PATH 路径上的资源时执行逻辑 HANDLER

    • app.all(PATH, HANDLER) 定义当使用任何方法请求 PATH 路径上的资源时执行逻辑 HANDLER

    (2)PATH

    PATH 定义匹配路径,它可以是字符串、字符串模式或正则表达式,下面是一些例子:

    • '/about' 匹配请求路径 /about

    • '/ab?cd' 匹配请求路径 /acd、/abcd(?:匹配 ? 前的字符 0 次或 1次)

    • '/ab+cd' 匹配请求路径 /abcd,/abbcd 等等(+:匹配 + 前的字符 1 次或多次)

    • /a/ 匹配任意包含字符 a 的请求路径(使用正则表达式几乎可以满足一切复杂的需求)

    我们还可以在路径中 指定参数,参数以 : 为前缀,用于捕获指定位置的值,并将其保存在 req.params

    var express = require('express')
    var app = express()
    app.get('/', function (req, res) {
        res.send('Hello World')
    })
    app.get('/firstname/:firstname/lastname/:lastname', function (req, res) {
        let params = req.params
        let result = params.firstname + ' ' + params.lastname
        res.send(result)
    })
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    
    /*
     * 执行结果:
     * 如果访问网址 http://127.0.0.1:5000
     * 那么就会返回 Hello World
     * 如果访问网址 http://127.0.0.1:5000/firstname/Steve/lastname/Jobs
     * 那么就会返回 Steve Jobs
    **/
    

    (3)HANDLER

    HANDLER 是路由匹配时的处理逻辑,它可以是函数、函数数组或两者的组合形式

    在使用多组函数时,必须确保使用 next() 方法将控制权传递给后续函数,否则将会直接终止

    var express = require('express')
    var app = express()
    var sayHello = function (req, res) {
        res.send('Hello World')
    }
    var reverseMessage = function(req, res) {
        let message = req.params.message
        let reverse = message.split('').reverse().join('')
        res.send(reverse)
    }
    var showParams = function (req, res, next) {
        let params = req.params
        console.log('---Params')
        for (let prop in params) {
            console.log(prop + ': ' + params[prop])
        }
        console.log('---------')
        next()
    }
    app.get('/', sayHello)
    app.get('/reverse/:message', [showParams, reverseMessage])
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    

    一般情况下,函数带有两个参数,分别是 RequestResponse 对象,用于处理请求和响应数据

    Request 对象 常见的属性和方法有:

    属性和方法 描述
    ip IP 地址
    originalUrl 原始 URL
    baseURL 基础 URL
    protocol 协议类型
    hostname 主机名
    subdomains 子域名
    path 资源路径
    query 查询字符串
    route 当前匹配路由
    params 路由参数,用于获取 GET 请求的内容
    body 当使用 body-parser 中间件时,包含请求主体,用于获取 POST 数据
    cookies 当使用 cookie-parser 中间件时,包含 Cookie 对象,用于获取 Cookie 内容
    get(field) 获取指定的 HTTP 请求头

    Response 对象 常见的属性和方法有:

    属性和方法 描述
    set(field[,value]) 设置 HTTP 响应头
    get(field) 返回 HTTP 响应头
    append(field[,value]) 添加 HTTP 响应头
    cookie(name,value[,option]) 设置 Cookie
    clearCookie(name[,options]) 清除 Cookie
    redirect([status,]path) 重定向到指定路径
    send([body]) 传送响应
    sendStatus(code) 传送状态码
    sendFile(path[,options][,fn]) 传送文件
    json([body]) 传送 JSON 数据
    jsonp([body]) 传送 JSONP 数据
    end([data][,encoding]) 结束响应

    3、高级路由设置

    (1)app.route()

    如果需要为同一路径的不同请求方法定义不同的处理函数,app.route(path) 是一个不错的选择

    app.route('/book')
        .get(function (req, res) {
        	res.send('Get a book')
        })
        .post(function (req, res) {
        	res.send('Add a book')
        })
        .put(function (req, res) {
        	res.send('Update the book')
        })
    

    (2)express.Router()

    express.Router([options]) 用于创建 Router 实例,它就像 express 的实例一样,可以添加路由和中间件

    我们可以创建一个路由文件 router.js,并在文件中编写如下代码:

    var express = require('express')
    var router = express.Router()
    // 添加中间件
    router.use((req, res, next) => {
      console.log('执行路由: ' + Date.now())
      next()
    })
    // 添加路由
    router.get('/', (req, res, next) => {
    	res.send('Home Page')
    })
    router.get('/about', (req, res, next) => {
    	res.send('About Page')
    })
    module.exports = router
    

    然后,我们可以在应用程序 server.js 中加载路由文件,代码如下:

    var express = require('express')
    var router = require('./router')
    var app = express()
    app.use('/router', router)
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    

    4、中间件函数

    中间件 (Middleware) 实际上是一个 函数,可以访问请求对象 Request,响应对象 Response 以及 next 函数

    中间件的加载顺序十分重要,先加载的中间件先执行,中间件可以分为以下几种类别

    • 应用程序级中间件:通过 app.METHOD() 方法和 app.use() 方法绑定到 express 实例
    var express = require('express')
    var app = express()
    // 由于没有指定路径,所以每个请求都会执行该中间件函数
    app.use(function (req, res, next) { // 中间件函数
        console.log('Time: ' + Date.now())
        next()
    })
    app.get('/user/:id', function (req, res, next) { // 中间件函数
        res.send('Hello, ' + req.params.id)
    })
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    
    • 路由器级中间件:通过 router.METHOD() 方法和 router.use() 方法绑定到 Router 实例

      它与应用程序级中间件的工作方式相同

    var express = require('express')
    var router = express.Router()
    router.use(function (req, res, next) { // 中间件函数
        console.log('Time: ' + Date.now())
        next()
    })
    router.get('/user', function (req, res) {  // 中间件函数
    	res.send('Hello, ' + req.params.id)
    })
    var app = express()
    app.use('/virtual', router)
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    
    • 错误处理中间件:与应用程序级中间件和路由器级中间件的定义方式相同

      区别在于错误处理中间件的参数有四个,分别是 function(err, req, res, next)

    app.use(function(err, req, res, next) {
        console.error(err.stack)
        res.status(500).send('Error!')
    })
    
    • 内置中间件:常用的内置中间件是 express.static(),将会在下面进行介绍

    • 第三方中间件:常用的第三方中间件可以参考 官方文档

    5、静态文件

    Express 内置的中间件函数 express.static() 可以 挂载图片、CSS 和 JS 之类的静态文件,语法格式如下:

    express.static(root, [options])
    

    其中,root 表示储存静态文件的根目录路径,options 是一个对象,用于提供更详细的信息

    我们创建一个项目,其中 public 目录用于储存静态文件,server.js 文件是程序的主入口,目录结构如下:

    + app
      + node_module
      + public
        + images
          - icon.png
          - background.png
        - index.html
        - style.css
        - script.js
      - server.js
      - package.json
    

    我们可以在 server.js 文件中声明 public 目录下的内容开放,如此客户端就可以通过地址直接请求资源

    例如 http://127.0.0.1:5000/images/icon.pnghttp://127.0.0.1:5000/hello.html

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

    如果需要创建 虚拟路径前缀,可以在挂载时指定,这样客户端就需要在原有路径前添加虚拟前缀才可访问资源

    例如 http://127.0.0.1:5000/static/images/icon.pnghttp://127.0.0.1:5000/static/hello.html

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

    【 阅读更多 Node.js 系列文章,请看 Node.js学习笔记

    版权声明:本博客属于个人维护博客,未经博主允许不得转载其中文章。
  • 相关阅读:
    Nacos安装部署文档
    mysql安装部署文档
    Postgresql数据库安装部署文档
    Sentinel安装部署文档
    Nginx安装部署手册
    golang 7. defer
    golang 6. 指针 *
    golang 5. import
    golang 4. 函数 func
    golang 3. 常量 const iota
  • 原文地址:https://www.cnblogs.com/wsmrzx/p/12241714.html
Copyright © 2011-2022 走看看