【问题标题】:nodejs express/routes and mysqlnodejs express/routes 和 mysql
【发布时间】:2014-05-24 13:06:52
【问题描述】:

我遇到了一个小问题。我正在尝试制作一个小型 API 来检查用户是否已存在于我的数据库中。

我使用 express 和 routes,所以我可以像“http://example.com/check/user/john”一样查询,它应该输出:true 或 false,具体取决于用户是否存在于数据库中。

在我的路线文件中,我有以下代码:

var mysql = require('mysql');
var pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'nodejs'  
});

module.exports = function(app){
    app.get('/register/check/u/:username', function(req, res){
        var output = 'false';
        pool.getConnection(function(err, conn) {
            query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
            query.on('error', function(err){
                throw err;
            });
            query.on('result', function(row){
                var output = 'true';
                console.log(row.email);
                console.log(output);
            });
           conn.release();
        });
        res.render('register/check_username', { output: output});
    });
);

问题是res.render('register/check_username', { output: output}); 将始终输出:false,但在我的控制台日志中,当用户已经存在时,它会显示true。

知道为什么输出变量没有更新吗?

解决方案: 正如 akaphenom 所解释的,pool.getConnection 被初始化为一个非阻塞进程,因此我的第一个代码自动将输出发送为 false。这是工作代码:

app.get('/register/check/u/:username', function(req, res){
    pool.getConnection(function(err, conn) {
        var output = 'false';
        query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
        query.on('error', function(err){
            throw err;
        });
        query.on('result', function(row){
            output = 'true';
        });
        query.on('end', function(result){
            res.render('register/check_username', { output: output});
        });
       conn.release();
    });
});

【问题讨论】:

    标签: mysql node.js express routes


    【解决方案1】:

    我相信您不允许这些调用的非阻塞性质。该变量设置为 false 连接被调用,然后挂起回调。在回调完成之前,您会立即呈现响应。

    module.exports = function(app){
        app.get('/register/check/u/:username', function(req, res){
            // you set the value of the output var
            var output = 'false';
            // this is a non-blocking call to getConnection which fires the callback you pass into it, once the connection happens.  The code continues on - it doesn't wait.
            pool.getConnection(function(err, conn) {
                query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
                query.on('error', function(err){
                    throw err;
                });
                query.on('result', function(row){
                    var output = 'true';
                    console.log(row.email);
                    console.log(output);
                });
               conn.release();
            });
    
            // you are getting here before the callback is called
            res.render('register/check_username', { output: output});
        });
    );
    

    为什么你会在控制台中得到正确的值?因为最终会调用回调并执行您期望的操作。它只是在 res.render 之后调用

    这更有可能是您想要的代码:

    module.exports = function(app){
        app.get('/register/check/u/:username', function(req, res){
            pool.getConnection(function(err, conn) {
                query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
                query.on('error', function(err){
                    throw err;
                });
                query.on('result', function(row){
                    var output = 'true';
                    console.log(row.email);
                    console.log(output);
                    res.render('register/check_username', { output: output});
                });
               conn.release();
            });
        });
    );
    

    【讨论】:

    • 谢谢。我不确定非阻塞的东西,通过您的回答更好地理解它。
    • NP 如果它适合您,请接受答案,以便其他遇到相同问题的人知道这是一个合适的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2020-08-31
    • 2011-08-18
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多