[英]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.