📅  最后修改于: 2023-12-03 15:14:57.605000             🧑  作者: Mango
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
方法获取了查询参数并存储在了 name
和 age
变量中,然后把这些信息发送了回去。
在 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
变量中,然后把其中的 name
和 age
参数发送了回去。
在 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-parser
和 cookie-parser
两个插件来解析请求体和解析 cookies。通过使用 app.use()
方法将这些插件应用于我们的应用程序。
以上就是 Express.js 应用的完整参考,我们简要介绍了 Express.js 应用的基础功能、路由、请求对象、响应对象、错误处理以及插件机制。本文仅作为参考指南,如果您需要更详细的文档,请参考官方文档。