javascript - 将快速验证函数作为单独的语句调用而不是使用逗号分隔的调用不起作用

标签 javascript node.js validation express sanitization

module.exports.register = function(req,res,next){

    body('fname').isLength({ min: 3, max:20 }).withMessage('First name must have minimum 3 chars and maximum 20 chars.')
    .isAlpha().withMessage('First name has non-alphabetic characters.');

    body('email').trim().isEmail().withMessage('Not in the email format');

    sanitizeBody('fname').trim().escape();

    sanitizeBody('email').trim().escape();

    const errors = validationResult(req);

    if(!errors.isEmpty()){
        sendResponse(res,{status: 422 ,body:errors});
    }
    else{
        next();
    }
}

这段代码执行通过,但express-validator似乎没有执行其功能。

相反,下面的代码可以正常工作。但我认为在这两种情况下它都应该有效。

module.exports.register = [

    body('fname').isLength({ min: 3, max:20 }).withMessage('First name must have minimum 3 chars and maximum 20 chars.')
    .isAlpha().withMessage('First name has non-alphabetic characters.'),

    body('email').trim().isEmail().withMessage('Not in the email format'),

    sanitizeBody('fname').trim().escape(),

    sanitizeBody('email').trim().escape(),

    (req, res, next) => {

        const errors = validationResult(req);

        if(!errors.isEmpty()){
            sendResponse(res,{status: 422 ,body:errors});
        }
        else{
            next();
        }
    } 
]

我在文档中找不到与我的查询相关的任何内容。 有什么帮助吗?提前致谢。

最佳答案

express-validation“语句”本质上是快速中间件函数。这意味着它们每个返回一个带有签名function(req, res, next)的函数。这些函数旨在由 Express API 调用。

第一个示例中发生的情况是,每个语句仅返回一个实际上并未被调用的函数。您的第一个示例相当于:

module.exports.register = function(req,res,next){

    function(req,res,next) {...}
    function(req,res,next) {...}
    function(req,res,next) {...}
    function(req,res,next) {...}

    const errors = validationResult(req);
    if(!errors.isEmpty()){
        sendResponse(res,{status: 422 ,body:errors});
    }
    else{
        next();
    }
}

理论上,您可以重新格式化您的第一个示例并使其工作,但您可能会陷入回调 hell ,我不建议这样做。这些行中的一些内容:

module.exports.register = function(req,res,next){
    (body('fname').isLength({ min: 3, max:20 }).withMessage('First name must have minimum 3 chars and maximum 20 chars.').isAlpha().withMessage('First name has non-alphabetic characters.')) (req, res, 
      (body('email').trim().isEmail().withMessage('Not in the email format')) (req, res,  
          (sanitizeBody('fname').trim().escape()) (req, res, 
              (sanitizeBody('email').trim().escape()) (req, res, function(req, res, next) {

                 const errors = validationResult(req);

                   if(!errors.isEmpty()){
                     sendResponse(res,{status: 422 ,body:errors});
                   }
                   else{
                     next();
                   }
                })))));
}

不要使用这段代码,它只是一个例子,说明事情会变得多么丑陋。使用第二个示例中的数组。

关于javascript - 将快速验证函数作为单独的语句调用而不是使用逗号分隔的调用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972651/

相关文章:

Javascript - 从多个集合中从 mongodb 收集数据然后合并到数组中

Silverlight DataGrid - 在未编辑单个单元格时验证新行

javascript - jQuery 获取内部文本输入的值

javascript - 如何在 Typescript 中添加 Knockout 自定义函数

node.js - PhoneGap 应用程序安装在设备上后可以访问本地主机吗?

javascript - Jade javascript block (服务器端)

javascript - 创建有效的电子邮件地址字符串(仅需要 @sign 的左侧)

c# - 基于 ItemsControl 中的验证项的 WPF 启用/禁用按钮

javascript - 我怎样才能让 IE 忽略一个类?

javascript - Twilio Sync - Twilio Sync 支持事件处理程序删除吗?