【问题标题】:can't return a select query value using mysql and node js无法使用 mysql 和节点 js 返回选择查询值
【发布时间】:2015-04-28 07:37:49
【问题描述】:

我是 node js 的新手,现在我正在尝试使用 node js 在 mysql 中设置 select 查询的返回值....我正在使用 node-mysql 包...

示例代码

var mysql =  require('mysql');
var connection =  mysql.createConnection({
    host : "localhost",
    user : "root",
    password: "root123",
    database: "testdb"
});

var retValue = undefined;

var query = connection.query('SELECT * FROM tblData;');
query
    .on('error', function(err) {
        // Handle error, an 'end' event will be emitted after this as well
    })
    .on('fields', function(fields) {
        // the field packets for the rows to follow
    })
    .on('result', function(row) {
        // Pausing the connnection is useful if your processing involves I/O
        connection.pause();
        processRow(row, function() {
            retValue = row;
        });
    })
    .on('end', function(row) {

    });

    connection.end();

    function processRow(rows)
    {
        retValue = rows;
    }

    console.log(retValue);

retValue 始终未定义。我知道这是异步调用。谁能告诉我如何为这个变量设置值。

谢谢 迪帕克

【问题讨论】:

标签: javascript mysql node.js asynccallback


【解决方案1】:

由于数据库查询是异步操作,因此在您调用console.log(retValue) 时,您的变量retValue 尚未设置。

var retValue;

var query = connection.query('SELECT * FROM tblData;');
query
    .on('error', function(err) {
        // Handle error, an 'end' event will be emitted after this as well
    })
    .on('fields', function(fields) {
        // the field packets for the rows to follow
    })
    .on('result', function(row) {
        // Pausing the connnection is useful if your processing involves I/O
        connection.pause();
        processRow(row);
        console.log(retValue); //retValue is now set
    })
    .on('end', function(row) {

    });

    connection.end();

    function processRow(rows)
    {
        retValue = rows;
    }

    console.log(retValue); // undefined, retValue has not been set yet

【讨论】:

    【解决方案2】:

    retvalue 仅在您放入结果部分的范围内可用。所以你可以做这样的事情来记录你的结果:

    var connection =  mysql.createConnection({
        host : "localhost",
        user : "root",
        password: "root123",
        database: "testdb"
    });
    
    var retValue = undefined;
    
    var query = connection.query('SELECT * FROM tblData;', function(err, results, fields) {
        console.log(results);
        // Here continue logic you needed with results from table
    });
    

    【讨论】:

    • 我无法得到超出范围的结果...我想像这样分配和返回值 fucntion() getResults{ ... ... var retValue = undefined; var query = connection.query('SELECT * FROM tblData;', function(err, results, fields) { retValue = results; });返回 retValue }; var ret = getResults(); console.log(ret);
    • @DeepakSamuel node.js 正在使用范围和回调方式。这是他的本性。您确定需要以这种方式实现代码吗?你可以尝试通过 promise 接口同步 vars。
    【解决方案3】:

    console.log 移动到function processRow(rows) 中,使其看起来像

    function processRow(rows)
    {
        retValue = rows;
        console.log(retValue);
    }
    

    也变了

    processRow(row, function() {
        retValue = row;
    });
    

    processRow(row);
    

    第二个参数未使用。

    【讨论】:

    • 我无法得到超出范围的结果...我想分配并返回这样的值 fucntion() getResults{ ... ... var retValue = undefined; var query = connection.query('SELECT * FROM tblData;', function(err, results, fields) { retValue = results; });返回 retValue }; var ret = getResults(); console.log(ret);
    • 不工作 patrick....控制台日志总是显示结果....但我无法从函数中得到结果
    • @DeepakSamuel 你无法从函数中得到结果。这就是异步回调的工作方式。它们在执行 外部部分之后执行,甚至在功能块之后执行外部部分。
    【解决方案4】:

    我无法得到超出范围的结果...我想像这样分配并返回值

    函数() 获取结果{ ... ... var retValue = 未定义;

    var query = connection.query('SELECT * FROM tblData;', function(err, results, fields) { retValue = 结果; });

    返回 retValue };

    var ret = getResults(); console.log(ret);

    【讨论】:

    • 这不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2020-12-12
    • 2020-06-20
    • 1970-01-01
    • 2015-06-03
    • 2019-10-31
    相关资源
    最近更新 更多