Express框架快速入门(一)

简介: Express框架快速入门

一. Express的简介和安装


1. Express简介


官网对这个框架的解释是:基于 Node.js 平台,快速、开放、极简的 Web 开发框架。Express的官网地址是https://www.expressjs.com.cn


Express的特色:

(1) Web 应用程序:Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。


(2) API :使用您所选择的各种 HTTP 实用工具和中间件,快速方便地创建强大的 API。


(3) 性能 :Express 提供精简的基本 Web 应用程序功能,而不会隐藏您了解和青睐的 Node.js 功能。


(4) 基础框架 :许多 流行的开发框架 都基于 Express 构建。


2. 在项目中安装Express


首先我们创建一个文件夹,然后我们先要初始化一下文件夹:


npm init -y


安装express:


npm install express --save


二. Express的使用


1. 入门简单案例


我们先简单使用一下Express,学习它的简单用法,由浅入深。本文后面小节里再来学习路由、中间件、请求处理等等的功能。

新建index.js文件,然后编写如下代码:


const express = require('express')
// 创建express实例
const app=express();
app.get("/",(req, res) => {
        res.send("hello world!");
})
app.get("/aaa",(req, res) => {
    res.send("aaa");
})
app.listen(3000,()=>{
    console.log("server start")
})


很简单吧,express创建http接口,相比Node.js的http模块来说也太方便了吧,只需要调用get()方法,然后里面传入请求的路径和回调函数就好了。而且回调里面也不用再调用res.write()和res.end()了,express封装了一个res.send()来代替。


这个小案例,我们浏览器访问相应的路径时,就会得到相应的显示:


745eaec98cb546c592170163f081b50f.png


而且,当我们访问一个我们没有定义的请求路径的时候,它会在页面上面显示出相应的错误。


0a3f2e73f699433d96313b41e0455915.png


我们上面说到express封装的res.send()方法,这个方法其实非常地妙,那么妙在哪里呢?下面举几个例子来体会。


我们更改一下代码,把之前请求的hello world!字符串改成html标签返回,看看会有什么效果:


const express = require('express')
// 创建express实例
const app=express();
app.get("/",(req, res) => {
        res.send(`
        <html>
          <h1>hello world!</h1>
        </html>
        `);
})
app.listen(3000,()=>{
    console.log("server start")
})

6bc37f09823c472094083135bde83d08.png

运行发现,它可以解析并返回html。

我们再改一下代码,看看它能不能返回json数据的接口:

const express = require('express')
// 创建express实例
const app=express();
app.get("/",(req, res) => {
        res.send({
            name:'害恶细君',
            age:20
        });
})
app.listen(3000,()=>{
    console.log("server start")
})

62786268ff2342f38842c75245a00ee5.png

也就是说在send()方法中传入一个对象的话,返回给前端的就是一个json字符串。


而且,express最好的地方就是:它的回调里面的req (请求) 和 res (响应) 与 Node.js 提供的对象完全一致,因此,你可以调用 req.pipe()、req.on('data', callback) 以及任何 Node 提供的方法。


2. Express基本路由


路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。


路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback...], callback) , app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数。


路由路径和请求方法一起定义了请求的端点,它可以是字符串、字符串模式或者正则表达式。但查询字符串不是路由路径的一部分。


(1) 使用字符串的路由路径示例:


// 匹配根路径的请求
app.get('/', function (req, res) {
  res.send('root');
});
// 匹配 /about 路径的请求
app.get('/about', function (req, res) {
  res.send('about');
});
// 匹配 /test.text 路径的请求
app.get('/test.text', function (req, res) {
  res.send('test.text');
});


(2) 使用字符串模式的路由路径示例(下面第1个使用得最多):


// 匹配 /ab/******
app.get('/ab/:id', function(req, res) {
  res.send('aaaaaaa');
});
// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});
// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});
// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
  res.send('ab*cd');
});
// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});


(3) 使用正则表达式的路由路径示例:


// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {
  res.send('/a/');
});
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});


可以为请求处理提供多个回调函数,其行为类似 中间件。唯一的区别是这些回调函数有可能调用 next(‘route’) 方法而略过其他路由回调函数。可以利用该机制为路由定义前提条件,如果在现有路径上继续执行没有意义,则可将控制权交给剩下的路径。


路由句柄有多种形式,可以是一个函数、一个函数数组,或者是两者混合,如下所示.


(1) 使用多个回调函数处理路由(记得指定 next 对象):


const express = require('express')
app.get('/example/b', function (req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});
app.listen(3000,()=>{
    console.log("server start")
})


(2) 使用回调函数数组处理路由:


const express = require('express')
// 创建express实例
const app=express();
let cb0 = function (req, res, next) {
    console.log('CB0')
    next()
}
let cb1 = function (req, res, next) {
    console.log('CB1')
    next()
}
let cb2 = function (req, res) {
    res.send('Hello from C!')
}
app.get('/test', [cb0, cb1, cb2])
app.listen(3000,()=>{
    console.log("server start")
})


(3) 混合使用函数和函数数组处理路由:


const express = require('express')
// 创建express实例
const app=express();
let cb0 = function (req, res, next) {
    console.log('CB0')
    next()
}
let cb1 = function (req, res, next) {
    console.log('CB1')
    next()
}
app.get('/test', [cb0, cb1], function (req, res, next) {
    console.log('response will be sent by the next function ...')
    next()
}, function (req, res) {
    res.send('Hello from D!')
})
app.listen(3000,()=>{
    console.log("server start")
})


3. 中间件的用法


Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。


中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件。


中间件的功能包括:执行任何代码、修改请求和响应对象、终结请求-响应循环、调用堆栈中的下一个中间件。


如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。


Express 应用可使用如下几种中间件:

(1) 应用级中间件

(2) 路由级中间件

(3) 错误处理中间件

(4) 内置中间件

(5) 第三方中间件


(1) 应用级中间件

应用级中间件绑定到 app 对象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要处理的 HTTP 请求的方法,例如 GET, PUT, POST 等等,全部小写。例如:


const express = require('express')
// 创建express实例
const app=express();
// 没有挂载路径的中间件,应用的每个请求都会执行该中间件
app.use(function (req, res, next) {
    console.log('Time:', Date.now())
    next()
})
// 挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求都会执行它
app.use('/user/:id', function (req, res, next) {
    console.log('Request Type:', req.method)
    next()
})
// 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求
app.get('/user/:id', function (req, res, next) {
    res.send('USER')
})
app.listen(3000,()=>{
    console.log("server start")
})


下面这个例子展示了在一个挂载点装载一组中间件。


const express = require('express')
// 创建express实例
const app=express();
// 一个中间件栈,对任何指向 /user/:id 的 HTTP 请求打印出相关信息
app.use('/user/:id', function(req, res, next) {
    console.log('Request URL:', req.originalUrl)
    next()
}, function (req, res, next) {
    console.log('Request Type:', req.method)
    next()
})
app.listen(3000,()=>{
    console.log("server start")
})


作为中间件系统的路由句柄,使得为路径定义多个路由成为可能。在下面的例子中,为指向 /user/:id 的 GET 请求定义了两个路由。第二个路由虽然不会带来任何问题,但却永远不会被调用,因为第一个路由已经终止了请求-响应循环。


const express = require('express')
// 创建express实例
const app=express();
// 一个中间件栈,处理指向 /user/:id 的 GET 请求
app.get('/user/:id', function (req, res, next) {
    console.log('ID:', req.params.id)
    next()
}, function (req, res, next) {
    res.send('User Info')
})
// 处理 /user/:id, 打印出用户 id (因为第一个路由已经终止了请求-响应循环,故它不会被调用)
app.get('/user/:id', function (req, res, next) {
    res.end(req.params.id)
})
app.listen(3000,()=>{
    console.log("server start")
})


如果需要在中间件栈中跳过剩余中间件,调用 next(‘route’) 方法将控制权交给下一个路由。


const express = require('express')
// 创建express实例
const app=express();
// 一个中间件栈,处理指向 /user/:id 的 GET 请求
app.get('/user/:id', function (req, res, next) {
    // 如果 user id 为 0, 跳到下一个路由
    if (req.params.id == 0) next('route')
    // 否则将控制权交给栈中下一个中间件
    else next() //
}, function (req, res, next) {
    res.send('aaa')
});
// 处理 /user/:id,
app.get('/user/:id', function (req, res, next) {
    res.send('bbb')
})
app.listen(3000,()=>{
    console.log("server start")
})


(2) 路由级中间件


路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router(),然后app.use('/', router)将路由挂载至应用


const router = express.Router()
相关文章
|
2月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
17天前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
2月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
56 1
|
29天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
1月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
30 0
|
2月前
|
JSON JavaScript 前端开发
Node.js Express 框架
10月更文挑战第7天
33 2
|
2月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
2月前
|
Web App开发 JavaScript API
构建高效后端系统:Node.js与Express框架的实践之路
【9月更文挑战第37天】在数字化时代的浪潮中,后端开发作为技术架构的核心,承载着数据处理和业务逻辑的重要职责。本文将深入探讨如何利用Node.js及其强大的Express框架来搭建一个高效、可扩展的后端系统。我们将从基础概念讲起,逐步引导读者理解并实践如何设计、开发和维护一个高性能的后端服务。通过实际代码示例和清晰的步骤说明,本文旨在为初学者和有经验的开发者提供一个全面的指南,帮助他们在后端开发的旅途上走得更远。
51 3
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
54 3
|
3月前
|
JSON JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的完美结合
【9月更文挑战第28天】在现代Web开发中,Node.js和Express框架的结合为创建高性能、易扩展的应用提供了强有力的支持。本文将深入探讨如何利用这两种技术构建一个简单但功能强大的Web服务,同时提供代码示例以加深理解。