📜  Express.js 应用完整参考(1)

📅  最后修改于: 2023-12-03 15:14:57.605000             🧑  作者: Mango

Express.js 应用完整参考

Express.js 是基于 Node.js 平台的 Web 应用开发框架,它提供了丰富的基础设施、灵活的路由方案以及强大的插件支持。本文将全面介绍 Express.js 应用开发的方方面面,为开发者提供一份全面的参考指南,希望能对您的开发工作有所帮助。

安装

可以使用 npm 来安装 Express.js:

$ npm install express --save
基础使用

创建一个 Express.js 应用非常简单,只需要引入 express 模块并调用其方法即可:

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

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log(`Server is listening on http://localhost:3000`);
});

在这个例子中,我们创建了一个简单的 Web 应用,使用 app.get() 方法为根路径添加了一个处理函数,并利用 app.listen() 方法指定监听的端口。当我们访问 http://localhost:3000 时,应用会返回 "Hello World!"。

注意,路由的处理函数需要接受两个参数:req 表示请求对象(包括请求头、请求参数等信息),res 表示响应对象(我们可以使用它来设置响应头、响应内容等信息)。

路由

路由是 Express.js 的核心特性之一,通过路由我们可以将不同的请求分发到不同的处理函数,并进行相应的处理。下面是一个例子:

app.get('/', (req, res) => {
  res.send('GET request to homepage');
});

app.post('/', (req, res) => {
  res.send('POST request to homepage');
});

在这里,我们使用了 app.get()app.post() 方法为根路径添加了两个不同的处理函数,分别对应 GET 和 POST 请求。当我们访问 http://localhost:3000 时,会触发相应的处理函数。

动态路由

有时我们需要在路由中使用动态参数,例如:

app.get('/users/:userId/books/:bookId', (req, res) => {
  res.send(req.params);
});

在这个例子中,我们使用了 : 符号来表示动态参数,例如 :userId:bookId。当请求匹配到该路由时,这些动态参数会被 Express.js 解析并存储在 req.params 中,我们可以在处理函数中使用它们。

路由路径匹配

路由路径可以使用多种方式进行匹配,例如:

// 不区分大小写
app.get('/about', (req, res) => {
  res.send('about');
});

// 区分大小写
app.get('/About', (req, res) => {
  res.send('About');
});

// 支持通配符 *
app.get('/ab*cd', (req, res) => {
  res.send('ab*cd');
});

// 支持正则表达式
app.get(/a/, (req, res) => {
  res.send('/a/');
});

路由处理链

在 Express.js 中,路由处理函数可以根据需要组成处理链,例如:

// 中间件函数
const logMiddleware = (req, res, next) => {
  console.log('Time: ', Date.now());
  next();
};

// 路由处理函数
const homeHandler = (req, res) => {
  res.send('home');
};

// 将中间件和路由处理函数按顺序组成处理链
app.get('/', logMiddleware, homeHandler);

在这个例子中,我们定义了一个中间件函数(即处理函数中的 next 参数),它会在处理请求前记录时间。然后我们将这个中间件函数和路由处理函数一起传递给 app.get() 方法组成处理链。

值得注意的是,中间件函数必须通过调用 next() 方法来触发下一个处理函数。如果中间件函数不调用 next() 方法,则后续的处理函数不会被执行。

请求对象

在 Express.js 中,请求对象(即 req)包含了客户端发送到服务器的所有请求信息,例如其中包含的参数、请求头、请求体等内容。

请求方法

在请求对象中,您可以通过 req.method 属性获取当前请求的方法:

app.get('/', (req, res) => {
  console.log(req.method);
  res.send('Hello World!');
});

在这个例子中,我们使用 req.method 方法获取了当前请求的方法,并在控制台输出了它。

请求参数

在 Express.js 中,您可以通过 req.query 属性访问 HTTP GET 请求中的查询参数。

例如,当请求 http://localhost:3000/?name=John&&age=25 时,您可以通过以下代码来获取这些参数:

app.get('/', (req, res) => {
  const name = req.query.name;
  const age = req.query.age;
  res.send(`Hello ${name}, you are ${age} years old`);
});

在这个例子中,我们使用 req.query 方法获取了查询参数并存储在了 nameage 变量中,然后把这些信息发送了回去。

请求头

在 Express.js 中,您可以通过 req.get(header_name) 方法来获取请求头中的特定信息。

例如,当请求头中包含 User-Agent 信息时,您可以通过以下代码来获取它:

app.get('/', (req, res) => {
  const userAgent = req.get('User-Agent');
  res.send(`Your User-Agent is ${userAgent}`);
});

在这个例子中,我们使用 req.get() 方法获取了请求头中的 User-Agent 值并将其发送回去。

请求体

在 Express.js 中,您可以通过 req.body 属性访问 HTTP POST 请求中的请求体参数。

需要注意的是,要使用 req.body,需要先安装中间件 body-parser

$ npm install body-parser --save

然后在您的代码中使用它:

const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));

现在,您可以通过以下代码来获取 HTTP POST 请求中的请求体:

app.post('/', (req, res) => {
  const data = req.body;
  const name = data.name;
  const age = data.age;
  res.send(`Hello ${name}, you are ${age} years old`);
});

在这个例子中,我们使用 req.body 方法获取了请求体并存储在了 data 变量中,然后把其中的 nameage 参数发送了回去。

响应对象

在 Express.js 中,响应对象(即 res)用于设置服务器要向客户端发送的所有响应信息。

响应头

与请求头类似,您可以使用 res.set(header_name, header_value) 方法来设置响应头中的特定信息。

例如,您可以通过以下代码将 Content-Type 设置为 text/html

app.get('/', (req, res) => {
  res.set('Content-Type', 'text/html');
  res.send('Hello World!');
});

在这个例子中,我们使用了 res.set() 方法设置了响应头中的 Content-Type 值,并将 "Hello World!" 作为响应主体发送回去。

响应主体

在 Express.js 中,您可以使用 res.send() 方法向客户端发送响应主体。

例如,您可以通过以下代码将 "Hello World!" 作为文本发送回去:

app.get('/', (req, res) => {
  res.send('Hello World!');
});

在这个例子中,我们使用了 res.send() 方法将 "Hello World!" 作为响应主体发送回去。

响应重定向

在 Express.js 中,您可以使用 res.redirect() 方法将客户端重定向到其他 URL。

例如,您可以使用以下代码将客户端重定向到 http://www.google.com

app.get('/', (req, res) => {
  res.redirect('http://www.google.com');
});

在这个例子中,我们使用了 res.redirect() 方法将客户端重定向到 http://www.google.com

错误处理

在 Express.js 中,错误处理是非常重要的一个方面,参考下列示例:

app.get('/', (req, res) => {
  try {
    // 可能会抛出异常的处理代码
  }
  catch (err) {
    // 处理异常的代码
    res.status(500).send('Internal Server Error');
  }
});

在这个例子中,我们使用了 try...catch 块来处理可能会抛出异常的代码。如果该代码块中出现了异常,我们会使用 res.status() 方法设置响应状态码,并使用 res.send() 方法向客户端发送错误信息。

需要注意的是,在生产环境中,您应该使用专业的日志记录工具来处理异常。参考以下示例:

const logger = require('log4js').getLogger();
app.get('/', (req, res) => {
  try {
    // 可能会抛出异常的处理代码
  }
  catch (err) {
    // 处理异常的代码
    logger.error(err);
    res.status(500).send('Internal Server Error');
  }
});

在这个例子中,我们使用了 log4js 模块来记录日志,并在出现异常时将异常信息记录到日志中。

插件

Express.js 支持插件机制,您可以通过使用插件来扩展应用的功能。下面是一个使用插件的示例:

const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');

const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());

// 在这里添加您的代码

在这个例子中,我们使用了 body-parsercookie-parser 两个插件来解析请求体和解析 cookies。通过使用 app.use() 方法将这些插件应用于我们的应用程序。

结语

以上就是 Express.js 应用的完整参考,我们简要介绍了 Express.js 应用的基础功能、路由、请求对象、响应对象、错误处理以及插件机制。本文仅作为参考指南,如果您需要更详细的文档,请参考官方文档。