📅  最后修改于: 2023-12-03 15:33:07.920000             🧑  作者: Mango
在 Node.js 中,Express 是一个非常流行的 Web 应用程序框架。本文将介绍如何使用 Express 动态路由和错误处理程序。
要使用 Express,您需要先安装它。使用 npm,运行以下命令:
npm install express --save
动态路由是指在路由路径中包含变量的路由。例如,如果您要匹配所有形如 /users/:id
的 URL,其中 :id
可以是任何值,您可以使用以下代码:
app.get('/users/:id', function(req, res) {
res.send('User ID: ' + req.params.id);
});
在此代码中,:id
表示变量,在请求的路径中实际的值将填充到 req.params.id
中。例如,如果请求路径为 /users/123
,则 req.params.id
的值将为 123
。
您还可以使用多个变量,如下所示:
app.get('/users/:id/books/:bookId', function(req, res) {
res.send('User ID: ' + req.params.id + ', Book ID: ' + req.params.bookId);
});
在此代码中,请求路径格式应为 /users/123/books/456
,其中 req.params.id
的值为 123
,req.params.bookId
的值为 456
。
在 Express 中,您还可以使用正则表达式来匹配路由。例如,以下代码将匹配所有 /users
数组中以字母 J 开头的用户名:
app.get(/^\/users\/j/, function(req, res) {
res.send('Users with names starting with J');
});
错误处理程序用于捕获运行时错误并向用户呈现友好的错误消息。
在 Express 中,如果路由处理程序中发生错误,可以使用 next()
将流程控制传递到错误处理程序中。例如,以下代码使用 next()
来将处理流程控制传递到错误处理程序中:
app.get('/users/:id', function(req, res, next) {
var id = req.params.id;
if (id != 123) {
next(new Error('Invalid user ID'));
} else {
res.send('User ID: ' + id);
}
});
在此代码中,如果 id
不等于 123
,则 next()
被调用来将流程控制传递到错误处理程序中。错误处理程序可以像下面这样定义:
app.use(function(err, req, res, next) {
res.status(500);
res.send('Error: ' + err.message);
});
在此代码中,使用 app.use()
添加了一个错误处理程序。如果路由处理程序中出现错误,将引发一个包含错误消息的 Error
对象并传递给错误处理程序。在此示例中,错误消息将呈现为文本字符串,并在 HTTP 响应中返回状态码 500
。
您还可以使用自定义错误处理程序来为特定类型的错误提供自定义错误消息。以下代码演示了如何使用自定义错误处理程序:
function NotFound(msg) {
this.name = 'NotFound';
this.message = msg || 'Not Found';
this.statusCode = 404;
}
NotFound.prototype = Object.create(Error.prototype);
NotFound.prototype.constructor = NotFound;
app.get('*', function(req, res, next) {
next(new NotFound());
});
app.use(function(err, req, res, next) {
if (err.name == 'NotFound') {
res.status(err.statusCode);
res.send('Page not found');
} else {
next(err);
}
});
在此代码中,定义了一个名为 NotFound
的自定义错误类,它继承自 Error
。当请求路径无法匹配现有路由时,将引发一个 NotFound
错误。当错误处理程序检测到 NotFound
错误时,它会返回状态码 404
和自定义错误消息 "Page not found"
。