无法通过自定义快速验证程序检查
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');
。
问题是当email不存在的时候,虽然没有显示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() })
}
});
希望对您有所帮助!
以下代码的目的是使用 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)
不为空,所以还是打印出错误信息'错误消息示例'。但是非自定义验证器没有任何问题,可以顺利通过检查。
我试图在 !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() })
}
});
希望对您有所帮助!