变量不保留功能之外的值

时间:2014-02-04 16:00:31

标签: javascript node.js

我正在尝试将数据变量从函数传递给app.get调用。 但是我函数中的全局变量“data”并没有保留数据库查询返回的值。我认为这是一个范围问题。我在开始时将'data'的值设置为null,以使整个函数中的变量可访问。我没有遇到任何错误情况。

function getCommands(query) {
    var data = null;
    try {

    pg.connect(cString, function(err, client, done) {
        // Catch any connection errors, and display them to the screen
        if(err) {
            return console.error('could not connect to postgres', err);
        }

        client.query(query, function(q_err, result) {

        // Release the client back to the pool
        done();

        if(q_err) {
            return console.error('error running query', q_err);
        }

        // Data object with an empty array to hold the row information
        data = {"data":[]};

        for (var row in result.rows)
        {
            //console.log(result.rows[row]);
            data.data.push(result.rows[row]);
        }
        //Here, data, has the correct return values.
        console.log(data);
        });

    });

    }
    catch( e )
    {
        console.log(e);
    }
    //Here, data, is null.
    console.log(data);
    return data;

}

app.get('/clients/', function(req, res) {
    res.send(getCommands('SELECT clientid, clientname FROM hourglass.clients ORDER BY clientid ASC'));
});

有人可以帮我确定为什么'数据'不会保留pg.connect函数之外的值吗?

2 个答案:

答案 0 :(得分:1)

我认为你的问题并不是变量没有保留函数之外的值,而是你在设置变量之前控制台.log(数据)正在执行

如果您将console.log('step X')放在代码中,如下例所示,您将看到代码执行的顺序。

function getCommands(query) {
    var data = null;
    console.log('STEP 1');

    pg.connect(cString, function(err, client, done) {

        console.log('STEP 3');

    });

    console.log('STEP 2');

}

答案 1 :(得分:1)

function getCommands(query, callback) {

try {

    pg.connect(cString, function(err, client, done) {
        // Catch any connection errors, and display them to the screen
        if(err) {
            return console.error('could not connect to postgres', err);
        }

        client.query(query, function(q_err, result) {

            // Release the client back to the pool
            done();

            if(q_err) {
                return console.error('error running query', q_err);
            }

            // Data object with an empty array to hold the row information
            var data = {"data":[]};

            for (var row in result.rows)
            {
                data.data.push(result.rows[row]);
            }
            callback(data); //After data is set, the value is passed back
        });
    });
}
catch( e )
{
    console.log(e);
}
}

app.get('/clients', function(req, res) {.....])

使用@dystroy提到的回调函数非常有效。