node.js - 如何解决 Express Validator 中间件错误?

标签 node.js express express-validator

首先,我有这样的 userController:

文件 userController.js

const { validationResults } = require('express-validator');
const { userSignUpValidation } = require('../validator/userSignUpValidate');


function userCreation(req, res) {
    try{
        const errors = validationResults(req);
        if(errors) {
            return res.status(400)
            .json({
                error: {
                    message: errors.array()[0].msg
                }
            })
        }

        bcrypt.hash(req.body.userPassword, saltRounds, function(err, hash) {
            User.create({
                userId: req.body.userId,
                userEmail: req.body.userEmail,
                userPhoneNumber: req.body.userPhoneNumber,
                userPassword: hash
            })
            .then((user) => {
                return res.status(200).json(user);
            })
            .catch((error) => {
                return res.status(400).json.error;
            });
        });
    } catch(error) {
        return res.status(400)
        .json({
            error: {
                message: error
            }
        })
    }
}

validator/userSignUpValidate.js中,代码如下:

'use strict'

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

module.exports = [
    check('userId').isLength({ min: 5 }).withMessage('The username at least more than 5 characters!'),
    check('userPassword').isLength({ min: 6 }).withMessage('The password at least more than 6 characters!'),
    check('userPhoneNumber').isLength({ min: 10 }).withMessage('The phone number at least more than 10 characters!'),
    check('userEmail').isEmail().withMessage('Is your email correct? Please be correct!')
]

当我在 postman 上测试它时,json 响应总是通过 userController.js 上的 catch 显示错误,而没有错误消息。

{
    "error": {
        "message": {}
    }
}


我的问题。为了确保快速验证器在正确的位置运行,我应该将代码放在哪里?

最佳答案

首先,您需要从 express-validator 导入 validationResult,在您的代码中导入 validationResults

其次,您没有使用 userSignUpValidate 中间件。该中间件可以在 Controller 中使用,但最好将其应用在 userRoute 中以保持 Controller 清洁。

因此,让我们将 userSignUpValidate 中间件应用于 userRoutes。 如果文件路径与您的不匹配,请修复它们。

const express = require("express");
const router = express.Router();
const usersController = require("../controllers/userController");
const userSignUpValidate = require("../validator/userSignUpValidate");

router.post("/register", [userSignUpValidate], usersController.userCreation);

module.exports = router;

然后在 Controller 中,我们需要从 express-validator 导入 validationResult 并使用它:

const { validationResult } = require("express-validator");

function userCreation(req, res) {
  try {
    const errors = validationResult(req);
    if(!errors.isEmpty()) {
      console.log(errors);
      return res.status(400).json({
        error: {
          message: errors.array()[0].msg
        }
      });
    }

    //other code you have
  } catch (error) {
    return res.status(400).json({
      error: {
        message: error
      }
    });
  }
}

exports.userCreation = userCreation;

当我们发送带有 3 个字符密码的请求正文时,如下所示:

{
  "userId": "userid",
  "userPassword": "123",
  "userPhoneNumber": "1234567890",
  "userEmail": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8aebe8e9caede7ebe3e6a4e9e5e7" rel="noreferrer noopener nofollow">[email protected]</a>"
}

响应将类似于 400 - 错误请求:

{
    "error": {
        "message": "The password at least more than 6 characters!"
    }
}

关于node.js - 如何解决 Express Validator 中间件错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59608129/

相关文章:

node.js - Now.js 中的 session 支持

typescript - 如何使用 TypeScript 在 express 中输入 `request.query`?

javascript - express-validator v4 校验函数中访问请求体

javascript - Grunt 没有看到我的 devDependency 模块

javascript - 如果哈希密码在数据库中,则可以在登录时在输入框中使用该哈希密码

node.js - 身份验证错误 : [Symbol(mongoErrorContextSymbol)]: {}

node.js - express/connect 中间件的控制顺序

javascript - 为什么我在 UI 中没有收到验证 Flash 消息,我收到这样的 Flash 错误 [object Object],[object Object],[object Object]

javascript - TypeError : req. checkBody(...).optional(...).isDate 不是函数

javascript - 查询对象。 "q"查询不起作用