mysql - Nodejs Express/路线和 mysql

标签 mysql node.js express routes

我遇到了一个小问题。我正在尝试制作一个小型 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();
    });
});

最佳答案

我相信您不允许这些调用的非阻塞性质。该变量设置为 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();
        });
    });
);

关于mysql - Nodejs Express/路线和 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994589/

相关文章:

node.js - Vanilla Node 与 express

mysql - 如何基于CREATE VIEW减少长SQL查询?

php - 根据项目类型自动计算输入日期

MYSQL - 引用的表/字段名称与未引用的名称

node.js - 为什么我不能用 NodeJS 解密我用 openssl 加密的文件?

JavaScript 将缓冲区中的十六进制字符串与 Python 进行比较

javascript - 查找比较每个索引的多个数组的最大值

Express.js 4 和带有 Express 路由器的套接字

mysql - Sequelize ORM 连接干净退出

php - mysql查询结果转字符串返回nil