javascript - 无法通过自定义快速验证器检查

标签 javascript node.js express-validator

以下代码的目的是使用express-validator检查电子邮件是否已存在于MongoDB中:

    app.post('/registerPage',[check('email').custom((email) => {
    // connect to database
    let MongoClient = require('mongodb').MongoClient;
    let url = 'mongodb://localhost';
    MongoClient.connect(url, function(err, client) {
        if (err) throw err;
        let db = client.db('Mydatabase');
        // search database
        return db.collection('users').findOne({
            email: email
        }).then(user => {
                if (user) {
                   console.log(user); // here console shows correct record in database
                   return Promise.reject('E-mail already in use');
                }
                // otherwise, it returns null
        });
    })
}).withMessage('Error Message Example')], (req, res) => {
    // Handle the request
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
       return res.status(422).json({ errors: errors.array() })
    }
  });

当电子邮件已存在时,控制台显示Promise.reject('E-mail already in use');

问题是当电子邮件不存在时,虽然没有显示 Promise.reject,但代码无法进一步处理,validationResult(req) 不为空,因此它仍然打印出错误消息“错误消息示例”。但非自定义验证器没有任何问题,可以成功通过检查。

我尝试在 !user 处添加 else 语句,但它不起作用。

问题是如何通过自定义验证检查,或者为什么数组 validationResult(req) 不为空,即使它应该为空?通过所有检查后,如何确保 validationResult 为空。

最佳答案

问题是您在 MongoClient.connect 的回调中返回 promise ,而不是验证器函数。尝试使用 Promise 包装器,例如:

app.post('/registerPage',[check('email').custom((email) => {
    return new Promise((resolve, reject) => {
        // connect to database
        let MongoClient = require('mongodb').MongoClient;
        let url = 'mongodb://localhost';
        MongoClient.connect(url, function(err, client) {
            if (err) throw err;
            let db = client.db('Mydatabase');
            // search database
            return db.collection('users').findOne({
                email: email
            }).then(user => {
                if (user) {
                console.log(user); // here console shows correct record in database
                return reject('E-mail already in use');
                }
                return resolve();
            });
        })

    });
}).withMessage('Error Message Example')], (req, res) => {
    // Handle the request
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() })
    }
});

希望这有帮助!

关于javascript - 无法通过自定义快速验证器检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60553421/

相关文章:

javascript - 如何在单击按钮时设置 Vaadin 8 LoadingIndicatorConfiguration

javascript - 是否可以在不使用 typescript 的情况下运行 angular2?

node.js - 如何在node.js中验证 Mongoose 连接mongodb

javascript - WebRTC - 'RTCPeerConnection' : The ICE candidate could not be added

node.js - 如何使用express-validator验证复选框值?

javascript - forEach 不是 JavaScript 数组的函数错误

javascript - 选择多个换行符正则表达式

javascript - 如何在正确的范围内做出 Promise,以便它具有要查询的正确值并返回?

node.js - 快速验证器自定义错误不起作用

javascript - 当表单设置为 enctype ='multipart/form-data' 时,快速验证器给出未定义的值