求问,Nodejs中对于表单校验一般用哪个库?

求问,Nodejs中对于表单校验一般用哪个库?

//定义
validator = (message)->
v = new Validator()
errors = []
v.error = (msg)->
console.log msg,‘msg’
errors.push(msg)
v.check(message.username, ‘用户名的长度应该在2到12个字符之间’).len(2, 12)
v.check(message.email, ‘请提供有效的邮箱地址’).isEmail()
v.check(message.password, ‘密码不能少于7个字符’).len(7, 64)
return errors

使用:

  console.log("save user:#{req.body.email} from signup")
  err = validator(req.body)

这样用,但是我发现node-validator作者修改了这个npm模块 已经不支持这么写了,总不能每条都判断异常吧。之前的写法,可以一次性把所有error都拿到的。

求问,大家一般用哪个validator。谢谢。


8 回复

在Node.js中进行表单校验时,express-validator 是一个非常流行且功能强大的库。它不仅提供了丰富的验证方法,还与Express框架无缝集成,能够方便地处理请求中的数据。

使用 express-validator 的步骤

首先,你需要安装 express-validator

npm install express-validator

接下来,我们可以利用 express-validator 来替换原有的验证逻辑。以下是一个简单的示例,展示了如何使用 express-validator 进行表单校验。

示例代码

const { check, validationResult } = require('express-validator');

// 定义路由处理函数
app.post('/signup', [
    // 验证规则
    check('username')
        .exists().withMessage('用户名不能为空')
        .isLength({ min: 2, max: 12 }).withMessage('用户名长度应在2到12个字符之间'),
    check('email')
        .exists().withMessage('邮箱不能为空')
        .isEmail().withMessage('请输入有效的邮箱地址'),
    check('password')
        .exists().withMessage('密码不能为空')
        .isLength({ min: 7 }).withMessage('密码长度至少为7个字符')
], (req, res) => {
    // 获取校验结果
    const errors = validationResult(req);
    
    if (!errors.isEmpty()) {
        // 如果存在错误,则返回错误信息
        return res.status(400).json({ errors: errors.array() });
    }

    // 处理表单提交的逻辑
    res.send('用户注册成功');
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 引入 express-validator:我们通过 require('express-validator') 引入所需的验证方法。
  2. 定义验证规则:使用 check() 方法来定义每个字段的验证规则。这里我们检查用户名、邮箱和密码,并为每个验证规则添加相应的错误消息。
  3. 获取验证结果:通过调用 validationResult(req) 获取验证结果,并检查是否存在错误。
  4. 处理错误:如果验证失败(即 errors.isEmpty() 返回 false),则返回包含所有错误信息的响应。
  5. 处理成功情况:如果验证通过,则继续执行后续的业务逻辑。

这种方式不仅能方便地一次性获取所有错误信息,还能与Express框架紧密集成,使得代码更加简洁和易读。


我还是在用 validator。 没必要一次性把所有 error 拿到吧?当第一次出错的时候,就返回第一次出错的原因好了呀。

自己写了一个…… 这个还是挺简单的吧?

用的是这个node-validator模块吗?文档中的示例代码显示,它是支持一次性处理所有错误的,虽然语法跟你写的代码不同。

像这种校验功能,如果放在客户端JavaScript执行,少一次与服务器端的交互,我感觉用户体验更好。

https://github.com/skipify/datagate 我也在寻找好方法,暂时用的自己刚写的这个,支持前后端验证,基本的验证规则可以复用

function notEmpty (val) {  
    return typeof val ==='string' && val !== '' && !(/^\s+$/.test(val));
}

function equal (val, val2) { 
    return val === val2;
}

function notEqual (val, val2) {
    return !equal(val, val2);
}

function validate (vds, val, val2) {
    for (var i = 0, len = vds.length; i < len; i++) {
        if (!vds[i].handler(val, val2)) {
            return vds[i].message;
        }
    }
    return '';
}

exports.validate = validate;

exports.validate.username = [
{
    message : '需要输入值.',
    handler : notEmpty
}];

exports.validate.password = [
{
    message : '需要输入值.',
    handler : notEmpty
},
{
    message : '密码必须在4位到16位.',
    handler : function (val) { 
        return val.length <= 16 && val.length >= 4;
    }
},
{
    message : '前后密码输入不一致.',
    handler : equal
}];

exports.validate.email = [
{
    message : '需要输入值.',
    handler : notEmpty
},
{
    message : '输入无效,必须是字符数字下划线.',
    handler : function (val) {
        return (/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)+$/).test(val);
    }
}];

exports.validate.notEmpty = [
{
    message : '需要输入值.',
    handler : notEmpty
}];

去年写的验证,只剩下一部分草稿了

可以试试ydr-validator

1、实例化一个表单验证

var validator = new require('ydr-validator');

2、添加验证规则

validator.pushRule({
	// 表单名称
	name: 'username',
	// 类型
	type: 'string',
	// 最小长度
	minLength: 4,
	// 最大长度
	maxLength: 12
});

更多验证规则参考readme

3、执行数据验证

validator.validateAll({username: 'abc'}, function(err, data){
	if(err){
		// 输出 username 字符长度不能少于4个长度
		return console.log(err.message);
	}
// data 为验证后的数据

});

在Node.js中进行表单验证时,通常会使用express-validator库。它不仅支持链式调用验证方法,还集成了Express框架,使得集成更加方便。

示例代码

首先需要安装express-validator

npm install express-validator

然后可以在路由处理函数中使用它来验证表单数据:

const { check, validationResult } = require('express-validator');

app.post('/signup', [
  // 验证规则
  check('username')
    .exists().withMessage('用户名不能为空')
    .isLength({ min: 2, max: 12 }).withMessage('用户名的长度应该在2到12个字符之间'),
  check('email')
    .exists().withMessage('邮箱不能为空')
    .isEmail().withMessage('请提供有效的邮箱地址'),
  check('password')
    .exists().withMessage('密码不能为空')
    .isLength({ min: 7, max: 64 }).withMessage('密码不能少于7个字符')
], (req, res) => {
  // 获取验证结果
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    // 如果验证失败,则返回错误信息
    return res.status(400).json({ errors: errors.array() });
  }
  
  // 处理正确的请求逻辑
  res.send('Signup successful');
});

解释

  1. 引入库:使用express-validator中的checkvalidationResult方法。
  2. 定义验证规则:在路由处理函数中通过数组传递多个验证规则。每个验证规则使用check方法指定需要验证的字段,并通过.withMessage()方法设置自定义的错误消息。
  3. 获取验证结果:使用validationResult(req)获取验证结果对象,如果存在错误则返回错误信息,否则继续处理正常流程。

这种方法不仅简化了代码结构,也使得验证过程更加灵活和强大。

回到顶部