【问题标题】:Using node-mysql in a function在函数中使用 node-mysql
【发布时间】:2012-11-14 01:35:11
【问题描述】:

我是 nodejs 的新手,有一个问题。

尝试创建一个函数,该函数将调用我从表中提及其 ID 的任何字段的值:

function getUserInfo (userID, dynamicField) {
    var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID));
    query.on('result', function(row) {
        return(row.dynamicField);
    });
};
console.log(getUserInfo(8, userEmail)) //this should get me the userEmail value of the user with userID=8

但是,我得到“未定义”。如果我使用console.log 而不是return,它会记录该值,但这没有用作在其他函数中用于获取值的函数。

如果我能得到修改函数的帮助,我会很高兴。

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    这是 async/nodejs 初学者的常见错误。您实际上已经在一个同步函数中包装了一个异步函数,该函数打破了节点事件循环的性质。返回表达式需要替换为回调。见下文:

    // Method
    function getUserInfo (userID, dynamicField, callback) {
        var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID));
        query.on('result', function(row) {
            callback(null, row.dynamicField);
        });
    };
    
    // Implementation
    getUserInfo(8, userEmail, function(err, result){
        console.log(err || result);
    });
    

    按照惯例,在 Nodejs 中,我们总是首先在回调中传递一个错误对象。在这种情况下,由于没有要捕获的错误,因此我们传递 null 代替它。

    【讨论】:

    • 是的,不考虑 PHP(同步)方式似乎需要时间。非常感谢。
    • 虽然我已将其标记为“已接受的答案”,但在尝试了代码后,我仍然得到“未定义”。我只是将此行更改为 getUserInfo(8, userEmail, function(err, result){ 到 getUserInfo(8, 'userEmail', function(err, result){ 但没有运气..
    • 我只是错过了一些简单的东西(括号):callback(null, row[dynamicField];
    • 我也花了一段时间(我也来自 PHP)。所以你明白了吗?
    • 是的,我想是的。实际上,它可以在不添加回调函数的情况下工作,因为(这就是我认为的原因) query.on('result' 已经是一个回调。我尝试了很多事情并意识到我必须将所有事情都视为异步,而不仅仅是函数和塑造所有代码以这种方式.. :) 再次感谢。
    猜你喜欢
    • 2014-08-23
    • 2014-01-16
    • 1970-01-01
    • 2014-05-05
    • 2020-04-05
    • 2011-10-31
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多