簡體   English   中英

無法通過自定義快速驗證器檢查

[英]Unable to pass custom express-validator check

以下代碼的目的是使用 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 包裝器,例如:

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() })
    }
});

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM