【问题标题】:Finding email on MySQL database with NODE.js使用 NODE.js 在 MySQL 数据库中查找电子邮件
【发布时间】:2020-02-27 22:29:26
【问题描述】:

我正在尝试通过简单的登录来验证用户。我在我的项目中使用 node.js 和 mysql,我正在做的是检查电子邮件是否存在于字段电子邮件和我的帐户表中。我将查询结果传递给一个常量行,然后检查它的长度,如果它返回大于 0,则意味着它找到了一些东西(?),这是我的 sn-p:

console.log(testEmail) //it does receives an email
console.log(password) //it does receives a password

const rows = await pool.query('SELECT * FROM accounts WHERE email = ?', [testEmail.email]);
console.log(rows); //row comes out empty

这里是完整的方法:

passport.use('local.signin', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
}, async(req, username, password, done) => {
    const {email} = req.body;
    const testEmail = {
        email
    };
    console.log(testEmail)
    console.log(password)

    const rows = await pool.query('SELECT * FROM accounts WHERE email = ?', [testEmail.email]);
    console.log(rows);
    if (rows.length > 0) {
        const user = rows[0];
        const validPassword = await helpers.matchPassword(password, user.password);
        if(validPassword){
            done(null, user, req.flash('success', 'Welcome!'));
        } else{
            done(null, false, req.flash('message', 'Incorrect password'));
        }
    } else{
        return done(null, false, req.flash('message', 'Email not found'));
    }
}));

添加邮箱和密码的控制台结果:

{ email: 'irwin.inoa@gmail.com' }
123456

添加我的表定义:

  `id` int(11) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` char(60) NOT NULL,
  `email` varchar(100) NOT NULL

关于如何解决这个问题的任何想法,我错过了什么吗?

更新:

如下所述,通过对象 testEmail 传递 email 属性可以解决此问题。

testEmail.email. 

感谢您的宝贵时间

【问题讨论】:

  • 可能像 (async function(){ const rows = await pool.query('SELECT * FROM accounts WHERE email = ?', [testEmail]); console.log(rows); })(); 这样的 IIFE 会有所帮助。
  • ``` passport.use('local.signin', new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, async(req, username, password, done) => { const {email} = req.body; const testEmail = { email }; console.log(testEmail) console.log(password) const rows = await pool.query('SELECT * FROM accounts WHERE email = ? ', [testEmail]); console.log(rows); if (rows.length > 0) { ```

标签: javascript mysql sql node.js


【解决方案1】:

原答案

正如我在docs 中看到的,pool.query() 函数有一个回调或返回一个承诺。您可以按如下方式捕获结果:

// callback

pool.query('SELECT * FROM accounts WHERE email = ?', [testEmail], (err, rows) => {
    if (err) {  
        return console.error('Error executing query', err.stack);
    }
    console.log(rows);
});


// promise

pool.query('SELECT * FROM accounts WHERE email = ?', [testEmail])
.then(rows => {
    return console.log(rows);
})
.catch(err => {
    return console.error('Error executing query', err.stack);
});

编辑

好的,所以只是为了测试,试试这段代码看看表格是否正确。也许我们没有正确地将参数传递给查询。

// return all records of the table

pool.query('SELECT * FROM accounts LIMIT 100', [], (err, rows) => {
    if (err) {  
        return console.error('Error executing query', err.stack);
    }
    console.log(rows);
});

// Another way to pass the parameter

pool.query('SELECT * FROM accounts WHERE email = $1::text', [testEmail], (err, rows) => {
    if (err) {  
        return console.error('Error executing query', err.stack);
    }
    console.log(rows);
});

【讨论】:

  • 您好!我试过这个方法,results.rows 返回 undefined
  • 只是打印results,它返回什么?
  • 我明白了:[ ]
  • accounts 表上有记录吗?你传递的testEmail表中有相关​​记录吗?
  • 是的,先生,这些是 mytable 属性:id int(11) NOT NULL, username varchar(50) NOT NULL, password char(60) NOT NULL, email varchar (100) 非空
【解决方案2】:

您的查询可能有错误,但由于您没有尝试/捕获您的查询,所以您不知道发生了什么。你可能想做这样的事情:

let rows = [];
try{
   rows = await pool.query('SELECT * FROM accounts WHERE email = ?', [testEmail.email]);
}catch(err){
   console.log("Query Error", err);
}

【讨论】:

  • 返回未定义
  • 好的,我尝试了 let rows = [ ],它仍然返回空,它是否与它的存储方式有关?它显示了在终端中传递的电子邮件,如下所示:{ email: 'irwin.inoa@gmail.com' }
  • 哦,现在看到你的完整代码了。我发现您将电子邮件存储在一个对象中。所以在查询中你需要使用[testEmail.email]
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多