首页 > 语言 > JavaScript > 正文

推荐一个基于Node.js的表单验证库

2024-05-06 15:42:27
字体:
来源:转载
供稿:网友

API 在执行过程中的一个基本任务是数据验证。 在本文中,我想向你展示如何为你的数据添加防弹验证,同时返回风格良好的格式。

在 Node.js 中进行自定义数据验证既不容易也不快。 为了覆盖所有类型的数据,需要写许多函数。 虽然我已经尝试了一些 Node.js 的表单库 —— Express 和 Koa ——他们从未满足我的项目需求。 这些扩展库要么不兼容复杂的数据结构,要么在异步验证出现问题。

使用 Datalize 在 Node.js 中进行表单验证

这就是为什么我最终决定编写自己的小巧而强大的表单验证库的原因,它被称为 datalize。 它是可扩展的,因此你可以在任何项目中使用它,并根据你的要求进行自定义。 它能够验证请求的正文、查询或参数,还支持async 过滤器和复杂的JSON结构,如 数组 或 嵌套对象。

Github:https://github.com/flowstudio/datalize

配置

Datalize可以通过npm安装:

npm install --save datalize

要解析请求的正文,你应该使用其他的库。 如果你还没有用过,我建议使用 koa-body for Koa 或 body-parser for Express。

你可以将本教程用于已配置好的HTTP API服务器,也可以使用以下简单的Koa HTTP服务器代码。

const Koa = require('koa');const bodyParser = require('koa-body');const app = new Koa();const router = new (require('koa-router'))();// helper for returning errors in routesapp.context.error = function(code, obj) {this.status = code;this.body = obj;};// add koa-body middleware to parse JSON and form-data bodyapp.use(bodyParser({enableTypes: ['json', 'form'],multipart: true,formidable: {maxFileSize: 32 * 1024 * 1024,}}));// Routes...// connect defined routes as middleware to Koaapp.use(router.routes());// our app will listen on port 3000app.listen(3000);console.log('🌍 API listening on 3000');

但是,这不是生产环境下的设置(你还应该使用logging,强制 授权, 错误处理等),不过这几行代码用于向你正常展示后面的例子足够了。

注意:所有代码示例都基于 Koa,但数据验证代码也同样适用于 Express。 datalize 库还有一个实现 Express 表单验证的例子。

一个基本的Node.js表单验证案例

假设你的 API 中有一个 Koa 或 Express Web 写的服务和一个端点,用于在数据库中创建包含多个字段的用户数据。其中某些字段是必需的,有些字段只能具有特定值,或者必须格式化为正确的类型。

你可以像这样写一个简单的逻辑:

/** * @api {post} / Create a user * ... */router.post('/', (ctx) => {  const data = ctx.request.body;  const errors = {};    if (!String(data.name).trim()) {    errors.name = ['Name is required'];  }    if (!(/^[/-0-9a-zA-Z/./+_]+@[/-0-9a-zA-Z/./+_]+/.[a-zA-Z]{2,}$/).test(String(data.email))) {    errors.email = ['Email is not valid.'];  }    if (Object.keys(errors).length) {    return ctx.error(400, {errors});  }    const user = await User.create({      name: data.name,      email: data.email,  });    ctx.body = user.toJSON();});            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选