所以,这里的代码导致了一些问题(我现在不会同时检查多个和闪烁的消息,因为我已经迷失了如何单独检查它们)。因此,当我从列表中删除王国和电子邮件时,如果我只使用“rows.length”,它就可以正常工作。我想检查所有三个字段,然后在检查之后再进入注册过程。
已更新
router.post('/register', function(req, res, next){
const username = req.body.username;
const kingname = req.body.kingname;
const email = req.body.email;
const password = req.body.password;
const password2 = req.body.password2;
req.checkBody('username', 'Username is Required').notEmpty();
req.checkBody('kingname', 'Kingdom Name is Required').notEmpty();
req.checkBody('email', 'E-Mail is Required').notEmpty();
req.checkBody('password', 'Password is Required').notEmpty();
req.checkBody('password2', 'Passwords do not match').equals(password);
let errors = req.validationErrors();
db.query('SELECT * FROM users WHERE username = ? OR kingname = ? OR email = ?', [username, kingname, email], function(err, rows){
if(err) {
console.log(err);
res.redirect('/');
return;
} else {
var rowLength = rows.length;
for (var i = 0; i < rowLength; i++){
if(i.username == req.body.username) {
console.log('Username is Taken');
req.flash('success', 'Username is taken');
res.redirect('/');
} else if (i.email == req.body.kingname) {
console.log('Kingdome Name Taken');
req.flash('success', 'Kingdom Name Taken');
res.redirect('/');
} else if (i.email == req.body.email) {
console.log('Email already registered');
req.flash('success', 'Email already registered');
res.redirect('/');
}
}
}
});
更新
ERROR:
for (var = 0; i < rowLength; i++){ ^
SyntaxError:意外的令牌=
好的,所以我最终将其余的代码包括在内,因为我认为这可能是我所做的一些其他事情,也会导致问题。
答案 0 :(得分:2)
即使设置了错误条件或者没有返回任何行,您也正在处理结果。如果设置了err,请不要尝试访问行。
您还需要迭代行,因为SELECT可以返回多行。不要直接访问rows.username。请使用foreach来检查所有结果。
如果您想要任何列匹配的行,请使用&#39; OR&#39;。
WHERE username = ? OR kigname = ? OR email = ?
您不需要将绑定值作为数组数组传递,只需要传递一个数组。
[username, kingname, email]
答案 1 :(得分:1)
所以,我认为你真的想要检查所有采取的事情并提供一个响应,而不是每个字段的重定向。通过仅选择您关心的实际字段,您的查询也可以稍微优化一下。
此外,在进行现场检查时,您需要检查单个行,而不是行数组。
最后,您应该使用'if'语句而不是'else if',因为您可能同时拥有重复的用户名和重复的电子邮件。
例如,像这样:
app.get('/p', (req, res)=>{
if(req.query.p = 1) res.send('hello');
else res.send('wrong');
});