1

Express 简介

Express 是一个流行的 Node.js Web 应用程序框架,它提供了一组强大的功能和工具,用于构建 Web 应用程序和 API。它是建立在 Node.js 的 HTTP 模块之上的,通过简化常见任务和提供灵活的路由机制,使得构建 Web 应用程序变得更加快速和简单。
它是web框架,能够提供后端服务能力,并能以类似JSP模版的形式渲染web页面。

express特性

express有两个核心模块——路由和中间件,路由是对请求路径的匹配与处理,中间件则是一个前置方法,比如在请求响应客户端(response to client)之前,你可以通过这个方法对返回的数据进行结构化、过滤或者其他的一些操作。

Express 的基本使用

准备工作

首先,确保你的电脑上已经安装了 Node.js。你可以在 Node.js 的官方网站(https://nodejs.org)上找到安装说明。

创建一个新的 Express 应用程序

mkdir express-demo
cd express-demo
npm init -y

image.png

这将创建一个名为 express-demo 的新文件夹,并在其中创建一个新的 Node.js 项目。

安装express

npm install express

以上命令会将 Express 框架安装在当前目录的 node_modules 目录中

创建一个简单的 Express 应用程序

在 my-express-app 文件夹中创建一个名为 app.js 的新文件

touch app.js

并在其中编写以下代码:

const express = require('express')

const app = express()

app.get('/', (req, res) => {
    res.send('hello world!')
})

app.listen(3000, () => {
    console.log('Server running at http://localhost:3000/')
})

监听 GET 请求

app.get('/', (req, res) => {
})

参数1: 客户端请求的url地址
参数2: 请求对应的处理函数

req:请求对象

  1. req.app:当callback为外部文件时,用req.app访问express的实例
  2. req.baseUrl:获取路由当前安装的URL路径
  3. req.body / req.cookies:获得「请求主体」/ Cookies
  4. req.fresh / req.stale:判断请求是否还「新鲜」
  5. req.hostname / req.ip:获取主机名和IP地址
  6. req.originalUrl:获取原始请求URL
  7. req.params:获取路由的parameters
  8. req.path:获取请求路径

更多参考 https://expressjs.com/zh-cn/4x/api.html#req

res:响应对象

  1. res.append():追加指定HTTP头
  2. res.set()在res.append()后将重置之前设置的头
  3. res.clearCookie():清除Cookie
  4. res.get():返回指定的HTTP头
  5. res.json():传送JSON响应
  6. res.send():传送HTTP响应
  7. res.status():设置HTTP状态码

执行以上代码:

node app.js
应用实例,访问地址为 localhost:3000

image.png

路由

我们已经了解了 HTTP 请求的基本应用,而路由决定了由谁(指定脚本)去响应客户端请求。在HTTP请求中,我们可以通过路由提取出请求的URL以及GET/POST参数等。
想象一下你住在一个公寓楼里,而每个房间都有一个房间号。路由就像是这个房间号一样,它告诉 Express 应用程序当接收到某个特定的 URL 请求时,该去哪里找到处理这个请求的代码。

const express = require('express')

const app = express()

app.get('/', (req, res) => {
    res.send('hello world!')
})

app.listen(3000, () => {
    console.log('Server running at http://localhost:3000/')
})

app.get('/todos/:id', (req, res) => {
    res.send(`get /todos/${req.params.id}`)
})

app.post('/todos', (req, res) => {
    res.send('post /todos')
})

app.patch('/todos', (req, res) => {
    res.send('patch /todos')
})

app.delete('/delete', (req, res) => {
    res.send('delete /todos')
})

image.png

image.png

路由模块化

Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块。这是为了防止一旦项目大,不方便维护

创建路由模块

// todoRoutes.js

const express = require('express');
const router = express.Router();

// 定义用户路由
router.get('/', (req, res) => {
  res.send('hello world');
});

router.get('/todos', (req, res) => {
  res.send('get todos');
});

module.exports = router;

注册路由模块

// app.js

const express = require('express');
const app = express();

const todoRoutes = require('./todoRoutes');

//app.use() 注册全局中间件,并添加前缀
app.use('/api', todoRoutes);

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

image.png

通过这种方式,你可以将不同功能模块的路由分别放在单独的文件中,使得代码更加清晰和易于维护。这种路由模块化的方法使得 Express 应用程序更具可扩展性,


kexb
474 声望15 粉丝