📅  最后修改于: 2023-12-03 15:08:18.512000             🧑  作者: Mango
在 Web 应用程序中,用户输入是非常重要的一部分,我们希望输入的数据是准确、恰当的,并且不会破坏我们的应用程序。然而,用户输入的数据是无法100%可靠的,因此我们需要对输入进行验证,以确保它们符合我们的期望。
express-validator 是一个 Node.js 库,它提供了一个易于使用的框架,用于验证提交的数据。它可以轻松处理常见的验证需求,如检查输入是否为必填字段、电子邮件格式是否正确等。
本文中,我们将探讨如何使用 express-validator 验证输入字段是否必须包含一个种子词。
在我们开始之前,让我们先了解一下什么是种子词。种子词是一个您期望用户输入的单词或短语,如果用户未在其输入中包含该单词或短语,则输入将被视为无效。
例如,假设您正在创建一个注册表单并希望用户提供您网站的 URL。您可以通过检查该输入是否包含“example.com”来验证URL是否有效。如果用户的输入中不包含该短语,则表单应报告出错。
接下来,让我们看看如何使用 express-validator 对输入字段执行此操作。
首先,我们需要安装 express-validator。您可以使用以下命令通过 npm 进行安装:
npm install express-validator
express-validator 提供了一个易于使用的 API,使我们能够对输入执行各种验证。我们可以使用以下代码来验证输入是否为必填字段:
const { body, validationResult } = require('express-validator');
// 定义路由和处理程序
router.post('/submit-form', [
// 验证输入是否必填
body('username').notEmpty(),
body('email').notEmpty(),
body('password').notEmpty()
], (req, res) => {
// 检查是否有验证错误
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// 如果没有错误,则继续处理请求
// ...
});
在上面的代码中,我们定义了一个路由,它将提交的表单数据发送到“submit-form”端点。在路由处理程序中,我们定义了一个中间件,用于验证所提交的数据。
我们使用 express-validator 中的 body()
函数来选择要验证的字段,紧随其后的是 notEmpty()
函数,该函数验证字段是否为必填字段。如果字段为空,自定义错误消息将包含在验证错误数组中。
在路由后面,我们使用 validationResult()
函数检查是否有任何验证错误。如果有错误,则我们将返回 HTTP 400(“错误请求”) 状态码和包含错误消息的 JSON 响应。
在此基础上,我们可以通过扩展验证函数来增强 express-validator 的功能。
使用 body()
和内置的验证函数是 express-validator 的最基本用法。但有时,默认的验证函数可能无法满足我们的需求。在这种情况下,我们可以编写自定义函数,以便较高级别的验证。
考虑以下情况:我们正在创建一套 API 来管理客户。每个客户都有一个唯一的 ID,我们希望验证客户 ID 是否至少有一个数字。在这种情况下,我们可以使用以下代码:
const { body, validationResult } = require('express-validator');
// 自定义函数
const containsDigit = value => {
if (value.match(/\d/)) {
return true;
}
throw new Error('必须包含至少一个数字');
}
// 定义路由和处理程序
router.post('/create-customer', [
// 自定义验证函数
body('customer_id').custom(containsDigit),
body('customer_name').notEmpty()
], (req, res) => {
// 检查是否有验证错误
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// 如果没有错误,则继续处理请求
// ...
});
在上面的代码中,我们创建了一个名为 containsDigit()
的自定义函数,该函数验证输入是否至少包含一个数字。我们使用 custom()
函数将该函数设置为要验证的字段的自定义验证函数。
在路由和处理程序后面,我们使用 validationResult()
函数来检查是否有任何验证错误。
现在让我们看一下如何使用自定义函数来验证输入是否包含一个种子词。假设我们正在编写一个应用程序,用户可以将自己的社交媒体链接添加到其个人资料中。我们想要确保这些链接指向特定的社交媒体网站,如 Twitter 或 Facebook。我们可以使用以下代码:
const { body, validationResult } = require('express-validator');
// 自定义函数
const containsSeed = seed => {
return value => {
if (value.includes(seed)) {
return true;
}
throw new Error(`必须包含 "${seed}" 关键字`);
}
}
// 定义路由和处理程序
router.post('/save-profile', [
// 自定义验证函数
body('twitter_url').custom(containsSeed('twitter')),
body('facebook_url').custom(containsSeed('facebook')),
// 非必填字段
body('instagram_url').optional().custom(containsSeed('instagram'))
], (req, res) => {
// 检查是否有验证错误
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// 如果没有错误,则继续处理请求
// ...
});
在函数 containsSeed()
中,我们从参数种子值创建一个闭包,该参数将在一段时间内存储并在 return
语句中使用。
在路由中,我们将一个 body()
调用作为要验证的字段的选择器,并使用 custom()
调用指定自定义验证函数。在本例中,我们提供了一个种子值 “twitter” 和一个种子值 “facebook”。
请注意,我们还可以使用 optional()
标记将某个字段视为非必填字段。我们还可以使用其他选项来进一步定义验证功能。
在本文中,我们介绍了如何使用 express-validator 验证输入字段是否必须包含种子词。我们首先了解了什么是种子词,然后介绍了使用 express-validator 检查输入的基础知识。最后,我们展示了如何编写自定义函数来执行更高级别的验证。
在您的应用程序中使用验证可以使用户输入更准确,并减少可能导致应用程序故障或失败的错误数据。使用 express-validator,您可以轻松地添加验证到您的应用程序,从而提高应用程序的健壮性和可靠性。