NodeJS MySQL检查多个

所以,这里的代码导致了一些问题(我不会去检查多个闪烁的消息在同一时间,因为我已经失去了如何检查他们单独)。 所以当我从列表中删除王国和电子邮件时,如果我只是使用“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('/'); } } } }); 

更新

错误:

  for (var = 0; i < rowLength; i++){ ^ 

SyntaxError:意外的标记=

好吧,所以我最终包括了我的其他代码,因为我认为这可能是我所做的一些事情,也是导致问题的原因。

所以,我想你真的想检查所有的事情,并提供一个响应,而不是在每个领域的redirect。 您的查询也可以通过只select您关心的实际字段进行优化。

另外,在进行字段检查时,您需要检查单个行,而不是行数组。

最后,您应该只使用“if”语句而不是“else if”,因为您可能同时拥有重复的用户名和重复的电子邮件。

例如,像这样的东西:

 db.query('SELECT username, kingname, email FROM users WHERE username = ? OR kingname = ? OR email = ?', [username, kingname, email], function(err, rows){ if(err) { console.error(err); return res.redirect('/'); } else { var rowLength = rows.length; var duplicateFields = []; for (var i = 0; i < rowLength; i++){ var row = rows[i]; if(row.username == username) { duplicateFields.push('username'); } if (row.kingname == kingname) { duplicateFields.push('kingname'); } if (row.email == email) { duplicateFields.push('username'); } } if (duplicateFields.length) { console.error('Duplicate fields: ', duplicateFields.join(',')); req.flash('error', duplicateFields.join(',') + ' are already taken'); // obviously, you can adjust this however you want return res.redirect('/') } else { res.render('/'); // or whatever } } }); 

即使设置了err条件,或者没有返回行,您也正在处理结果。 如果设置了错误,不要尝试访问行。

您还需要遍历行,因为您的SELECT可能会返回多行。 不要直接访问rows.username。 用foreach来检查所有的结果。

如果您想要任何列匹配的行,请使用“或”。

 WHERE username = ? OR kigname = ? OR email = ? 

您不需要将绑定值作为数组数组传递,而只需要传递一个数组。

 [username, kingname, email]