javascript - 无法通过自定义快速验证器检查
问题描述
以下代码的目的是使用 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');
。
问题是当email不存在时,虽然没有显示Promise.reject
,但代码不能进一步处理,validationResult(req)
不是空的,所以它仍然打印出错误消息'错误消息示例'。但是可以成功通过检查的非自定义验证器没有任何问题。
我试图添加一个else
语句 where !user
,它不起作用。
问题是如何通过自定义验证检查,或者为什么数组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() })
}
});
希望这可以帮助!
推荐阅读
- marklogic - MarkLogic MLCP:是否可以将特定模块数据库设置为命令行选项
- xml - 使用 RequestHandler->renderAs XML 将 `htmlspecialchars()` 应用于 CDATA
- javascript - JavaScript:结合两个正则表达式来满足两者?
- c# - “安全地”存储(在客户端)令牌以供重用?
- python - 如何使用 min_date 和 max_date 值“重新索引”数据帧
- c# - C# RegEx 模式将字符串拆分为 2 个字符的子字符串
- r - 如何使用 R 中的 idw() 函数预测特定点的值?
- php - 带有 isset() 的 for 循环!= null - 为什么?
- java - Spring Boot、Gradle 和 Visual Studio Code - Gradle bootRun 任务无法正常工作
- java - 如何在 Java 中处理大型数据库表而不会遇到性能问题